【问题标题】:Test for multiple values in an if statement in C# [duplicate]在 C# 中的 if 语句中测试多个值 [重复]
【发布时间】:2012-03-24 13:51:58
【问题描述】:

在 C# 中是否有一种简写语法可以做到这一点:

if ((x == 1) || (x==2) || (x==5) || (x==13) || (x==14))

... 更短?类似(假设)

if (x in {1, 2, 5, 13, 14})

我“感觉”它存在,我只是在精神上和 Googly 上出现问题。实际上,我必须经常测试一堆枚举,而且它只是不可读。如果语言已经支持的话,我也讨厌做一个小助手函数。

提前致谢!

编辑

有一些涉及列表的巧妙解决方案……但我希望有某种纯粹的逻辑构造。如果它不存在,那就这样吧。谢谢!

【问题讨论】:

标签: c# syntax if-statement


【解决方案1】:

试试这个:

if ((new[]{1, 2, 5, 13, 14}).Contains(x)) ...

【讨论】:

  • 是的......我想这会比我所拥有的稍微干净一些。在没有超简单语法的情况下,我只使用“Jeremy D”发布的 3907299 之类的辅助函数。还是谢谢。
  • HashSet<T> 会比Array 快! =)
【解决方案2】:

虽然我认为 if 语句很好,并且为了简洁起见使代码简短是没有用的,但这里是:

第一种方法,假设你想走 LINQ 路线:

if ((new[]{1,2,5,13,14}).Contains(x)){
}

第二种方法,ArrayList

if ((new System.Collections.ArrayList(new[]{1,2,5,13,14})).Contains(x)){
}

第三种方法,列表:

if ((new System.Collections.Generic.List<Int32>(new[]{1,2,5,13,14})).Contains(x)){
}

但请记住,所有这些都会增加更多开销(考虑到性能,实际上不会增加​​太多的可读性)。

哦,还有working example of the above

【讨论】:

  • 关于开销的好点。这将比我需要阅读的频率高得多。
【解决方案3】:

我建议使用HashSet(T) Class 来检查元素是否属于元素集合。

此外,由于HashSet&lt;T&gt;是一个关联容器,其查找复杂度为O(1),即常数时间:HashSet(Of T).Contains Method,而ArrayList&lt;T&gt;具有线性时间查找:O(n)。所以,HashSet&lt;T&gt; 更适合查找。

HashSet<int> numbers = new HashSet<int> { 1, 2, 5, 13, 14 };
int x = 1;
if (numbers.Contains(x))
{
    Console.WriteLine("Contains!");
}

【讨论】:

    【解决方案4】:

    不,不支持这样直接比较。但是,您可以使用 LINQ 方法,例如 Contains()。我可以提供一个示例,但这有点取决于数据项最初的存储方式。

    【讨论】:

      【解决方案5】:

      你也许可以这样做:

      if( Array.LastIndexOf(new int[]{1, 2,3,4}, x) != -1)
      {
          //YOUR CODE HERE
      }
      

      未经测试,但我相信这会起作用。

      编辑 似乎已经发布了类似的回复。

      【讨论】:

        猜你喜欢
        • 2019-10-03
        • 1970-01-01
        • 2017-02-09
        • 1970-01-01
        • 1970-01-01
        • 2019-01-04
        • 1970-01-01
        • 1970-01-01
        • 2021-03-16
        相关资源
        最近更新 更多