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

问题描述:

例如,如果在计算机零件的材料列表中包含许多不同零件编号的文本框中,我只需要一种类型的cat5电缆在任何给定的时间,如果看到两种不同的类型,警告用户。 cat5电缆部件号可以是:cat5PART#1,cat5PART#2和cat5PART#3。所以如果只有一个cat5零件号码没有问题,但只要看到两种不同的类型或更多,就会发出警告。我可以很容易地为每个变体手动写出三次不同的时间,但是在更大的部件列表中,这需要更长的时间和风险错误。另外我只想知道程序员如何处理这种类型的函数。我也不知道它是什么,所以我不知道如何谷歌,尽管知道会有这种确切的情况有很多的解决方案,所以它是令人沮丧的,这么简单。如何避免为不同字符串编写简单的“if contains”语句的每个变体

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

基本上我不想写出来,在更大的范围

如果包含第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"); 
       } 
+0

这当然不会帮助你将你的子表达式包装在不必要的括号中。 – ChaosPandion

+1

...但它肯定没有伤害,所以我不明白这与问题有关。 –

+0

我尝试删除括号,我得到的错误,你能帮我理解哪些我应该删除,所以我可以知道吗?也可以更容易地阅读代码,或者在大规模使用较少的括号时可以提高性能吗?Thx – Saintjah

你可以试试这个:

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

非常感谢你和brokenglass,现在它变得非常有意义。我需要更多的思考。 – Saintjah

您可以使用LINQ/Count()来测试你是否有至少X个字符串要测试包含在textBox2.Text

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"); 
} 

每个字符串添加到List<string>,然后遍历每一个foreach声明。

本质上讲,这问题是有点不同的东西的设计解决了。

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

这听起来有点过头了,但总的来说,做这样的事情总是很好,所以你准备好了改变。最后(在具体的规则本身中),你显然有一个类似于你的实现,但可能写得比较短,就像BrokenGlass所表明的那样。