如何简洁地检查字符串是否等于多个值中的任何一个?

时间:2011-06-12 23:48:49

标签: delphi

我目前有一条记录(具有不同的值)和三个具有特定指定值的用户常量(例如名称等)。

我可以将编辑框与一个用户进行比较,如下所示:

if edit1.text = user1 
 then xxxx

这很好,但是如何指定编辑框必须在三个不同的用户之间进行检查?

示例:

if edit1.text = user1 to user3
 then xxxx

我该如何做到这一点?

4 个答案:

答案 0 :(得分:8)

Delphi的最新版本(我使用XE)包含单元StrUtils.pas,其中包含

function MatchText(const AText: string; const AValues: array of string): Boolean;
function MatchStr(const AText: string; const AValues: array of string): Boolean;

MatchStr是区分大小写的版本。

现在可以像这样解决您的问题:

if MatchStr(edit1.text, [user1, user2, user3])
  then xxxx

答案 1 :(得分:3)

您可以使用AnsiMatchStr()/ AnsiMatchText()来检查字符串是否与数组中的某个字符串匹配。 AnsiIndexStr()/ AnsiIndexText()也返回匹配字符串的索引,因此在 语句的情况下非常有用。

答案 2 :(得分:2)

对于可能在运行时稍后增长的集合,我可能会声明一个TStringList,如果我有一个类实例来保存“可接受的值”并将大if (x=a1) or (x=a2) or (x=a3)....序列替换为:

 // FAcceptableValues is TStringList I set up elsewhere, such as my class constructor.
 if FAcceptableValues.IndexOf(x)>=0 then ...

这具有可定制的好处。在你的逻辑的情况下,我会考虑制作一个控件列表,并做一个匹配功能:

 var 
   Users:TList<TUser>;
   Edits:TList<TEdit>;
 begin
    ... other stuff like setup of FUsers/FEdits.
    if Match(Users,Edits) then ... 

匹配可以写成下一个循环的简单:

 For U in Users do 
     for E in Edits do
          if U.Text=E.Text then 
            begin 
             result := true;
             exit
            end;

答案 3 :(得分:1)

Delphi不支持在case语句中使用字符串,所以你必须这么做。

 if ((user1.name = edit1.text) and (user1.surname = edit2.text)) or 
    ((user2.name = edit1.text) and (user2.surname = edit2.text)) or 
    ((user3.name = edit1.text) and (user3.surname = edit2.text)) 
   then xxxx