Delphi 2007中有没有集成的解决方案来检查TStringList包含某个值的一部分?
例如:
List.AddObject('This is a string', customStringObject1);
List.AddObject('This is a mushroom', customStringObject2);
List.AddObject('Random stuff', customStringObject3);
搜索 “This is a” 应该给我“true”,因为前两个元素部分包含此内容。
到目前为止我知道的唯一方法是
TStringList.find(string,integer)
,但这会执行完整的字符串比较,即仅搜索This is a string将返回true。
有什么建议吗?
未集成,但您可以在 Text 属性上使用 Pos 函数:
Pos('This is a', List.Text)
如果您希望将其集成,您可以为 TStrings 创建一个类帮助器。
不直接,不。您必须:
1) 在
Pos()
属性上调用 Text
,如果您有很多字符串,则效率不高。
2) 手动循环列表,在每个
Pos()
上调用 String
。效率更高,但编码也更多。
3) 从
TStringList
派生一个新类,并重写其虚拟 CompareStrings()
方法来根据需要比较字符串(默认实现简单地调用 AnsiCompareStr()
或 AnsiCompareText()
,具体取决于 CaseSensitive
属性)。如果找到匹配项,则返回 0。然后,您可以使用 TStringList.Find()
方法,该方法在内部调用 CompareStrings()
(请小心,TStringList.Sort()
也是如此,但如果改为调用 TStringList.CustomSort()
则可以避免这种情况)。
正如 Toon Krijthe 提到的,类助手可能是一个优雅的解决方案:
TStringsHelper = class helper for TStrings
function Contains(const s:string): Boolean;
end;
function TStringsHelper.Contains(const s:string): Boolean;
begin
Result := self.IndexOf(s) <> -1;
end;
您可以致电:
if list.Contains('some text') then
...