Delphi 如何创建和使用不区分大小写的ILST<;字符串>;在Spring4d中
我正在尝试使用以下代码创建不区分大小写的IList: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']);
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;