有没有办法缩短条件,如果它总是比较相同的东西?
当我需要写一个一遍又一遍地比较相同项目的条件时,我总是发现它很烦人,因为我会多次输入该项目的类型:
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
大大提高了性能:
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 }