Delphi 如何创建和使用不区分大小写的ILST<;字符串>;在Spring4d中

Delphi 如何创建和使用不区分大小写的ILST<;字符串>;在Spring4d中,delphi,delphi-10.1-berlin,spring4d,Delphi,Delphi 10.1 Berlin,Spring4d,我正在尝试使用以下代码创建不区分大小写的IList: procedure TForm1.ListButtonClick(Sender: TObject); var MyList: IList<string>; begin MyList := TCollections.CreateList<string>(TStringComparer.OrdinalIgnoreCase()); MyList.AddRange(['AAA', 'BBB', 'CCC']);

我正在尝试使用以下代码创建不区分大小写的IList:

procedure TForm1.ListButtonClick(Sender: TObject);
var
  MyList: IList<string>;
begin
  MyList := TCollections.CreateList<string>(TStringComparer.OrdinalIgnoreCase());
  MyList.AddRange(['AAA', 'BBB', 'CCC']);
  Memo1.Lines.Add(MyList.IndexOf('aaa').ToString);
end;
procedure TForm1.listbutonclick(发送方:TObject);
变量
MyList:IList;
开始
MyList:=TCollections.CreateList(TStringComparer.OrdinalIgnoreCase());
AddRange(['AAA','BBB','CCC']);
备注1.Lines.Add(MyList.IndexOf('aaa').ToString);
结束;
但是,IndexOf调用始终返回-1。这样行吗?如有任何建议,我们将不胜感激

更新:比较器似乎用于排序,但不用于IndexOf。IndexOf使用了一个单独的“EqualityComparer”,因此问题变成了如何更改它

更新2:我只是想在Johan的回答中补充一点,列表可以这样创建:

MyCIList := TCaseInsensitiveList<string>.Create(
  TStringComparer.OrdinalIgnoreCase(),
  TStringComparer.OrdinalIgnoreCase());
MyCIList:=TCaseInsensitiveList.Create(
TStringComparer.OrdinalIgnoreCase(),
TStringComparer.OrdinalIgnoreCase());

IndexOf的代码如下所示:

function TList<T>.IndexOf(const item: T; index, count: Integer): Integer;
begin
  Result := TArray.IndexOf<T>(fItems, item, index, count, EqualityComparer);
end;
现在,您可以创建自己的
tcasensitiveList
,如下所示:

type
  TCaseInsensitiveList<T> = class(Spring.Collections.TList<T>)
    constructor Create(const Comparer: IComparer<T>; 
                       const EqualityComparer: IEqualityComparer<T>);
  end;
  .....
constructor TCaseInsensitiveList<T>.Create(
             const Comparer: IComparer<T>; 
             const EqualityComparer: IEqualityComparer<T>);
begin
  inherited Create(Comparer);
  Self.fEqualityComparer:= EqualityComparer;
end;
类型
TCaseInsensitiveList=class(Spring.Collections.TList)
构造函数创建(常量比较器:IComparer;
常数相等比较:IEqualityComparer);
结束;
.....
构造函数tcasensitiveList.Create(
常量比较器:IComparer;
常数相等比较:IEqualityComparer);
开始
继承创建(比较器);
Self.fEqualityComparer:=相等comparer;
结束;
或者,您也可以将基
GetEqualityComparer
类函数声明为虚拟函数,并在子类中重写该函数


使
GetEqualityComparer
虚拟是有代价的,这就是我选择保护底层类变量的原因。

此问题已在Spring4D修补程序1.2.1中得到解决。随着更改,下面的代码按预期工作

procedure TForm1.ListButtonClick(Sender: TObject);
var
  MyList: IList<string>;
begin
  MyList := TCollections.CreateList<string>(TStringComparer.OrdinalIgnoreCase());
  MyList.AddRange(['AAA', 'BBB', 'CCC']);
  Memo1.Lines.Add(MyList.IndexOf('aaa').ToString);  // Correctly returns 0.
end;
procedure TForm1.listbutonclick(发送方:TObject);
变量
MyList:IList;
开始
MyList:=TCollections.CreateList(TStringComparer.OrdinalIgnoreCase());
AddRange(['AAA','BBB','CCC']);
Memo1.Lines.Add(MyList.IndexOf('aaa').ToString);//正确返回0。
结束;

非常好!请注意,类(部分应该是类(Spring.Collections.Lists.TList)。我看到您在Spring4D问题跟踪器中创建了一个提到这一点的问题…谢谢!太好了!我只是需要这个功能。找不到您提到的Spring4D Spring4D 1.2.1修补程序,但2017-11-03年的Spring1.2有效。
type
  TCaseInsensitiveList<T> = class(Spring.Collections.TList<T>)
    constructor Create(const Comparer: IComparer<T>; 
                       const EqualityComparer: IEqualityComparer<T>);
  end;
  .....
constructor TCaseInsensitiveList<T>.Create(
             const Comparer: IComparer<T>; 
             const EqualityComparer: IEqualityComparer<T>);
begin
  inherited Create(Comparer);
  Self.fEqualityComparer:= EqualityComparer;
end;
procedure TForm1.ListButtonClick(Sender: TObject);
var
  MyList: IList<string>;
begin
  MyList := TCollections.CreateList<string>(TStringComparer.OrdinalIgnoreCase());
  MyList.AddRange(['AAA', 'BBB', 'CCC']);
  Memo1.Lines.Add(MyList.IndexOf('aaa').ToString);  // Correctly returns 0.
end;