Best way to find if a string is in a list (without generics)

送分小仙女□ 提交于 2019-12-20 09:29:30

问题


I want do something like this:

Result = 'MyString' in [string1, string2, string3, string4];

This can't be used with strings and I don't want to do something like this:

Result = (('MyString' = string1) or ('MyString' = string2));

Also I think that creating a StringList to do just this is too complex.

Is there some other way to achieve this?

Thanks.


回答1:


You could use AnsiIndexText(const AnsiString AText, const array of string AValues):integer or MatchStr(const AText: string; const AValues: array of string): Boolean;

Something like

Result := (AnsiIndexText('Hi',['Hello','Hi','Foo','Bar']) > -1);

or

Result := MatchStr('Hi', ['foo', 'Bar']); 

AnsiIndexText returns the 0-offset index of the first string it finds in AValues that matches AText case-insensitively. If the string specified by AText does not have a (possibly case-insensitive) match in AValues, AnsiIndexText returns –1. Comparisons are based on the current system locale.

MatchStr determines if any of the strings in the array AValues match the string specified by AText using a case sensitive comparison. It returns true if at least one of the strings in the array match, or false if none of the strings match.

Note AnsiIndexText has case-insensitively and MatchStr is case sensitive so I guess it depends on your use

EDIT: 2011-09-3: Just found this answer and thought I would add a note that, in Delphi 2010 there is also a MatchText function which is the same as MatchStr but case insenstive. -- Larry




回答2:


The code by Burkhard works, but iterates needlessly over the list even if a match is found.

Better approach:

function StringInArray(const Value: string; Strings: array of string): Boolean;
var I: Integer;
begin
  Result := True;
  for I := Low(Strings) to High(Strings) do
    if Strings[i] = Value then Exit;
  Result := False;
end;



回答3:


Here is a function that does the job:

function StringInArray(Value: string; Strings: array of string): Boolean;
var I: Integer;
begin
  Result := False;
  for I := Low(Strings) to High(Strings) do
  Result := Result or (Value = Strings[I]);
end;

In fact, you do compare MyString with each string in Strings. As soon as you find one matching you can exit the for loop.




回答4:


You can try this:

Result := Pos(MyString, string1+string2+string3+string4) > 0


来源:https://stackoverflow.com/questions/246623/best-way-to-find-if-a-string-is-in-a-list-without-generics

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!