有没有办法缩短条件,如果它总是比较相同的东西?

当我需要写一个一遍又一遍地比较相同项目的条件时,我总是发现它很烦人,因为我会多次输入该项目的类型:

string x = textBox1.Text; if (x == "apple" || x == "orange" || x == "banana" ...) ... 

我想要这样的东西(但当然这不是正确的语法):

 if (x == "apple" || "orange" || "banana" ...) 

有没有使用字符串数组的解决方案?

你的情况说:如果我匹配任何预定义的值,我就是这样。 换句话说,如果我是预定义集合的元素,它在语义上是Contains方法:

 if (new [] { "apple", "orange", "banana" }.Contains(x)) { } 

使用arrays将来可以提供更大的灵活性。 您可以将其解压缩,重复使用,存储,查询等等。当我必须处理超过2个已知值时,我总是使用“数组和循环”。

注意:正如Scott Chamberlain在评论中指出的那样使用HashSet.Contains大大提高了性能:

 var values = new HashSet { "apple", "banana", "orange" }; if (values.Contains(x)) { } 

扩展方法怎么样?

 public static class Extensions { public static bool IsOneOf(this T input, params T[] possibilites) { bool result = possibilites.Contains(input); return result; } } 

然后,您可以将代码重写为如下所示:

 string input = textBox1.Text; if(input.IsOneOf("apple", "orange", "banana")) { // .... } 

您最好的选择(在性能方面)是使用HashSet

  static HashSet Fruits = new HashSet {"apple", "banana", "orange"}; string x = textBox1.Text; if( Fruits.Contains( x)) { 

一旦你在if条件中超过三个或更多的可能性,HashSet将比直接比较运行得更快。

您可以将重复的代码移动到该方法,这也将解释为什么此代码是重复的 – 因为它validation了某些内容是否成果。 它将提高代码的可读性和可维护性。 您还可以重构此逻辑(例如将其转换为switch语句):

 private bool IsFruit(string name) { switch(name) { case "apple": case "orange": ... case "banana": return true; default: return false; } } 

用法:

 string x = textBox1.Text; if(IsFruit(x)) ... 

更新:最好不要使用如此复杂的条件 – 有时候真的很难理解。 您可以使用Introduce Explaining Variable或Extract Method (如上所述)重构来使您的代码更清晰。

像这样使用switch语句

 switch (x) { case "apple": case "orange": case "banana": //code break; } 

你可以尝试一下switch语句:

 switch (x) { case "apple": case "orange": case "banana": //... break; } 

您可以使用switch语句:

 switch(x) { case "apple": case "orange": case "banana": // "if" code goes here break; default: // "else" code goes here break; } 

linq解决方案

 var strarray = new string[] { "apple", "orange", "banana" }; bool a = strarray.Any( x=> x == textBox1.Text); if(a) //CODE else //code 

试试像这样的开关盒

 Switch(value) { case "apple": case "orange": case "banana":.... //code you want break; } 

我喜欢扩展方法解决方案并且以前使用过它。 以下是我在“CommonUtils”库中提供的方法:

  public static bool IsIn(this T toFind, IEnumerable collection) { return collection.Contains(toFind); } public static bool IsIn(this T toFind, ICollection collection) { return collection.Contains(toFind); } public static bool IsIn(this T toFind, params T[] items) { return toFind.IsIn(items.AsEnumerable()); } 

在这三者之间,您几乎可以使用任何集合,还可以将项目指定为参数列表。

你可以这样做:

 string it = "apple,orange,banana"; if(it.Contains(x)) { //do work } 

更简单:

 if("apple,orange,banana".Contains(x)) { //do work }