如何避免为不同的字符串编写简单的“if contains”语句的每个变体

Posted

技术标签:

【中文标题】如何避免为不同的字符串编写简单的“if contains”语句的每个变体【英文标题】:How to avoid writing every variation of a simple "if contains" statement for different strings 【发布时间】:2012-02-14 17:31:46 【问题描述】:

例如,如果在一个包含计算机零件材料列表中的许多不同零件编号的文本框中,我在任何给定时间只需要一种类型的 cat5 电缆,并且如果看到两种不同的类型,则警告用户. cat5 电缆部件号可能是:cat5PART#1、cat5PART#2 和 cat5PART#3。因此,如果只看到一个 cat5 零件编号,请不要担心,但一旦看到两种或更多不同类型,就会发出警告。我可以很容易地为每个变体手动写出三个不同的时间,但是在更大的零件列表中,它会花费更长的时间并且可能会出错。另外,我很想知道程序员如何处理这种类型的函数。我也不知道它叫什么,所以我不知道如何用谷歌搜索它,尽管知道对于这种确切情况会有很多解决方案,所以不得不在论坛上给人们发错误是令人沮丧的这么简单的事情。

我的代码示例显然不起作用,因为它只会在检测到所有三个部分时发出警告,而不仅仅是检测到两个部分如下。我假设我会使用 & 和 | 的一些变体或者可能是完全不同的东西?

基本上我不想写得更大规模

如果包含第 1 部分和第 2 部分

如果包含第 1 部分和第 3 部分

如果包含第 2 部分和第 3 部分

谢谢。

    if ((textBox2.Text.Contains("PART#1"))
      && (textBox2.Text.Contains("PART#2"))
      &&  (textBox2.Text.Contains("PART#3")))
              
            MessageBox.Show("2 types of cat5 part numbers seen at the same time");
              

【问题讨论】:

将子表达式包含在不必要的括号中当然无济于事。 ...但它肯定不会受到伤害,所以我看不出这与问题有什么关系。 我尝试删除括号但出现错误,您能帮我了解我应该删除哪些括号以便我知道吗?也是为了更好地阅读代码,还是在大规模减少括号时提高性能?谢谢 不,删除括号不能可能提高性能。如果它确实,那么删除括号会改变代码的含义和行为。编译器不关心多余的括号,它只是忽略它们。因此,如有疑问,请加括号! 【参考方案1】:

您可以使用Linq /Count()来测试textBox2.Text中是否至少包含x个要测试的字符串:

string[] parts =  "PART#1", "PART#2", "PART#3" ;
if(parts.Count(s=> textBox2.Text.Contains(s)) >= 2)

   MessageBox.Show("2 types of cat5 part numbers seen at the same time");

【讨论】:

【参考方案2】:

将每个字符串添加到List<string>,然后使用foreach 语句遍历每个字符串。

【讨论】:

【参考方案3】:

你可以试试这个:

string[] parts = new [] "PART#1", "PART#2", "PART#3";
int count = parts.Count(s => textBox2.Text.Contains(s));
if (count >= 2) ...

【讨论】:

非常感谢你和碎玻璃,现在这很有意义。我需要更多地跳出框框思考。【参考方案4】:

基本上这个问题是通过稍微不同的设计来解决的。

您真正想要的是对某些输入运行某种规则验证,所以我可能会创建一些更通用的东西,然后每个规则将包含一组它希望检查的好属性为了。然后,您可以从处理数据的通用“针对输入运行规则”阶段调用它。

这听起来可能有点过头了,但总的来说,这样做很好,这样你就可以为变化做好准备。

最后(在特定规则本身)你显然会有一个有点像你的实现,但可能以更短的方式编写,就像 BrokenGlass 所展示的那样。

【讨论】:

以上是关于如何避免为不同的字符串编写简单的“if contains”语句的每个变体的主要内容,如果未能解决你的问题,请参考以下文章

如何避免 NoRouteToHostException?

将任何变量从大端转换为小端 - 如何避免空指针?

如何避免在 C/C++ API 中编码字符串混淆?

如何避免重新声明子方法,仍然为不同的子类定义不同的方法?

闲来无事,为大伙分享一个对象池的编写

Web 服务器如何避免 TIME_WAIT?