C#:最优雅的方法来测试int x是否是给定集合的元素?

Efr*_*ain 26 .net c# coding-style

问题:测试是否x∉{2,3,61,71}

我经常想知道是否有更好的方法:

if (x != 2 && x != 3 && x != 61 && x != 71)
{
  // do things
}
Run Code Online (Sandbox Code Playgroud)

if (!new List<int>{ 2, 3, 61, 71 }.Contains(x))
{
  // do things
}
Run Code Online (Sandbox Code Playgroud)

后者看起来相当优雅,但实际上如果你读它会有点恼火,特别是因为倒置.这是一种丑陋的事情,因为在英语中我们说"x不是...的元素",这在C#中难以表达而不会刺激开销.也许一个人if (Object(x).IsElementOf(new[] { ... }))怎么说?

嗯......有什么建议吗?是否有任何.Net标准方法来测试这样的事情?

Tho*_*que 44

我使用扩展方法:

using System.Linq;

...

public static bool In<T>(this T item, params T[] list)
{
    return list.Contains(item);
}

...


if (!x.In(2,3,61,71))
...
Run Code Online (Sandbox Code Playgroud)

IsElementOf如果您更喜欢这个名字,可以将其重命名为...

  • &lt;micro-optimisation&gt;如果此方法旨在大量使用和/或针对大量元素,那么您可能会通过在内部使用 `Array.IndexOf(list, item) != -1` 获得轻微的性能改进比 LINQ 的 `Contains` 方法。&lt;/micro-optimisation&gt; (2认同)
  • @LukeH &lt;nitpicking&gt;如果优化是本质,那么最好简单地坚持丑陋的 (x != 2 &amp;&amp; x != 3 &amp;&amp; x != 61 &amp;&amp; x != 71) 并完全避免调用的开销一个函数并构建一个一次性列表。&lt;/nitpicking&gt; (2认同)

Bla*_*erX 8

老问题,但还没有看到这个简单的答案:

!new []{2, 3, 61, 71}.Contains(x)
Run Code Online (Sandbox Code Playgroud)


Abb*_*bas 5

您可以使用以下LinQ方法:

var list = new List<int> { 1, 2, 3, 4, 5 };
var number = 3;

if (list.Any(item => item == number))
    //number is in the list
Run Code Online (Sandbox Code Playgroud)

为了便于阅读,您可以将其放在扩展方法中:

public static bool IsElementOf(this int n, IEnumerable<int> list)
{
    return list.Any(i => n == i);
}

//usage
if(3.IsElementOf(list)) //in the list
Run Code Online (Sandbox Code Playgroud)