当我需要编写一个反复比较同一个项目的条件时,我总是觉得很烦人,因为我会多次输入该项目:
string x = textBox1.Text;
if (x == "apple" || x == "orange" || x == "banana" ...)
...
我想要这样的东西(但当然这不是正确的语法):
if (x == "apple" || "orange" || "banana" ...)
除了使用字符串数组之外,还有其他解决方案吗?
当我需要编写一个反复比较同一个项目的条件时,我总是觉得很烦人,因为我会多次输入该项目:
string x = textBox1.Text;
if (x == "apple" || x == "orange" || x == "banana" ...)
...
我想要这样的东西(但当然这不是正确的语法):
if (x == "apple" || "orange" || "banana" ...)
除了使用字符串数组之外,还有其他解决方案吗?
你的条件是:如果我匹配任何预定义的值,我就是真的。换句话说,如果我是预定义集合的一个元素,这在语义上是该Contains
方法:
if (new [] { "apple", "orange", "banana" }.Contains(x))
{
}
使用数组在未来提供了更多的灵活性。您可以将其提取出来、重用、存储、缓存等。当我必须处理超过 2 个已知值时,我总是使用“数组和循环”。
注意:正如 Scott Chamberlain 在评论中指出的那样,使用HashSet<T>.Contains
大大提高了性能:
var values = new HashSet<string> { "apple", "banana", "orange" };
if (values.Contains(x))
{
}
扩展方法呢?
public static class Extensions
{
public static bool IsOneOf<T>(this T input, params T[] possibilites)
{
bool result = possibilites.Contains(input);
return result;
}
}
然后,您可以将代码重写为如下所示:
string input = textBox1.Text;
if(input.IsOneOf("apple", "orange", "banana"))
{
// ....
}
您可以将重复的代码移动到该方法中,这也将解释为什么此代码是重复的 - 因为它会验证某物是否是水果。它将增加代码的可读性和可维护性。你也可以重构这个逻辑(例如把它变成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(如上)重构来使您的代码更清晰。
您最好的选择(就性能而言)是使用 HashSet
static HashSet<string> Fruits = new HashSet<string> {"apple", "banana", "orange"};
string x = textBox1.Text;
if( Fruits.Contains( x)) {
一旦在 if 条件中超过三个左右的可能性,HashSet 将比直接比较运行得更快。
我喜欢扩展方法解决方案并且以前使用过它。以下是我在“CommonUtils”库中可用的方法:
public static bool IsIn<T>(this T toFind, IEnumerable<T> collection)
{
return collection.Contains(toFind);
}
public static bool IsIn<T>(this T toFind, ICollection<T> collection)
{
return collection.Contains(toFind);
}
public static bool IsIn<T>(this T toFind, params T[] items)
{
return toFind.IsIn(items.AsEnumerable());
}
在这三个之间,您几乎可以使用任何集合,也可以将项目指定为参数列表。
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;
}
像这样使用 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;
}
你可以这样做:
string it = "apple,orange,banana";
if(it.Contains(x))
{
//do work
}
更简单:
if("apple,orange,banana".Contains(x))
{
//do work
}