4

当我需要编写一个反复比较同一个项目的条件时,我总是觉得很烦人,因为我会多次输入该项目:

string x = textBox1.Text;

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

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

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

除了使用字符串数组之外,还有其他解决方案吗?

4

10 回答 10

10

你的条件是:如果我匹配任何预定义的值,我就是真的。换句话说,如果我是预定义集合的一个元素,这在语义上是该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))
{

}
于 2012-07-24T19:33:17.673 回答
7

扩展方法呢?

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"))
{
    // ....
}
于 2012-07-24T19:38:37.763 回答
1

您可以将重复的代码移动到该方法中,这也将解释为什么此代码是重复的 - 因为它会验证某物是否是水果。它将增加代码的可读性和可维护性。你也可以重构这个逻辑(例如把它变成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 VariableExtract Method(如上)重构来使您的代码更清晰。

于 2012-07-24T19:34:11.620 回答
1

您最好的选择(就性能而言)是使用 HashSet

    static HashSet<string> Fruits = new HashSet<string> {"apple", "banana", "orange"};

    string x = textBox1.Text;
    if( Fruits.Contains( x)) {

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

于 2012-07-24T19:52:55.260 回答
0

我喜欢扩展方法解决方案并且以前使用过它。以下是我在“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());
    }

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

于 2012-07-24T21:09:11.507 回答
0

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;
}
于 2012-07-24T19:32:57.920 回答
0

像这样使用 switch 语句

switch (x)
{
   case "apple":
   case "orange":
   case "banana":
      //code
      break;
}
于 2012-07-24T19:33:04.143 回答
0

您可以尝试使用 switch 语句:

switch (x)
{
    case "apple":
    case "orange":
    case "banana":
        //...
        break;
}
于 2012-07-24T19:33:06.080 回答
0

您可以使用 switch 语句:

switch(x)
{
    case "apple":
    case "orange":
    case "banana":
        // "if" code goes here
        break;
    default:
        // "else" code goes here
        break;
}
于 2012-07-24T19:33:41.447 回答
-2

你可以这样做:

string it = "apple,orange,banana";

if(it.Contains(x))
{
  //do work
}

更简单:

if("apple,orange,banana".Contains(x))
    {
      //do work
    }
于 2012-07-24T19:35:44.740 回答