【问题标题】:How do I concisely check whether a string equals any of several values?如何简洁地检查字符串是否等于多个值中的任何一个?
【发布时间】:2011-06-13 18:32:15
【问题描述】:

我目前有一个记录(具有各种值)和三个具有特定分配值(例如名称等)的用户常量。

我可以像这样将一个编辑框与一个用户进行比较:

if edit1.text = user1 
 then xxxx

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

例子:

if edit1.text = user1 to user3
 then xxxx

我该怎么做?

【问题讨论】:

  • 这样删除您的问题可能会吸引反对票,您的声誉得分可能会变为负数。如果您对您的问题不满意,请重写它,以便以后可能会来的人受益。
  • StackOverflow 在理念上以及它对您使用过的其他论坛的工作方式上都不同。我建议您在再次发布之前阅读stackoverflow.com/faq。第一个原则是,您不仅要为自己编写问题和答案,还要为那些追随您的人编写问题和答案。

标签: delphi


【解决方案1】:

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 非常棒,一个同时使用开放数组和内置 RTL 函数的解决方案
  • @Marjan:他们肯定是在 D2007 中 - 而 IIRC 他们是更早引入的,它们应该已经出现在 D7 中。
  • @Idsandon:哦,天哪,我真的应该像我的一位同事那样开始比较源代码树...
  • Delphi中有很多鲜为人知的RTL函数。当帮助系统变得不那么完整和实用时,就更难找到它们了
【解决方案2】:

您可以使用 AnsiMatchStr()/AnsiMatchText() 检查字符串是否与数组中的某个字符串匹配。 AnsiIndexStr()/AnsiIndexText() 还返回匹配字符串的索引,因此在 case of 语句中很有用。

【讨论】:

  • +1 我要补充一点,AnsiMatchStr/Text 函数是 MatchStr/Text 的区域设置特定等价物。
【解决方案3】:

对于稍后可能在运行时增长的集合,我可能会声明一个 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 ... 

Match 可以写成一个简单的 for next 循环:

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

【讨论】:

  • 字符串列表似乎相当重量级
  • 这里有回声吗? :-)
【解决方案4】:

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

【讨论】:

  • 谢谢。是否可以在我的原始帖子中(在编辑中)做我想做的事情?
  • 是的,有几个额外的括号,否则将无法正确评估。
  • 与使用“case”和“in”语句的整数相比,击键次数要多得多。
  • @wannabecoder,如果你还没有找到这些网站,我建议你看看它们marcocantu.com/epascaldelphibasics.co.uk
  • 多次重复使用edit1.text 不是一个好主意。这个属性很慢,每次执行它的 getter 时都使用 GDI 消息。您应该使用临时字符串,然后与值进行比较。
猜你喜欢
  • 1970-01-01
  • 2022-06-19
  • 2016-01-21
  • 1970-01-01
  • 2022-10-13
  • 1970-01-01
  • 2013-08-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多