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

本文关键字:元素 方法 集合 测试 int 是否是 | 更新日期: 2023-09-27 18:15:28

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

我经常想知道是否没有比更好的方法了

if (x != 2 && x != 3 && x != 61 && x != 71)
{
  // do things
}

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

后一个看起来很优雅,但实际上如果你读它的话,它有点令人恼火,尤其是因为倒置。这是一件丑陋的事情,因为在英语中,我们说"x不是…的元素">,如果没有令人恼火的开销,这在C#中很难表达。也许可以说if (Object(x).IsElementOf(new[] { ... }))左右?

嗯。。有什么建议吗?有吗。网络标准方法来测试这样的东西?

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

我使用一个扩展方法:

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))
...

如果您喜欢这个名称,可以将其重命名为IsElementOf。。。

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

!new []{2, 3, 61, 71}.Contains(x)

您可以使用以下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

为了可读性,你可以把它放在一个扩展方法中:

public static bool IsElementOf(this int n, IEnumerable<int> list)
{
    return list.Any(i => n == i);
}
//usage
if(3.IsElementOf(list)) //in the list

怎么样

if(new[] { 2, 3, 61, 71 }.Except(x).FirstOrDefault() != 0)
{
   ...
}

还是那些线路上的什么?

原来2、3、61和71是素数。所以,把你的数字模化成25986(=2*3*61*71(。如果结果为非零,则继续执行If块。

if ((x < 2) || (25968 % x != 0))
{ /* do all the stuff */ }

我强烈建议在代码中对这种技术进行大量注释。

var list=CreateNewList(); //returns your list of elements
var element=GetElement(); //returns an element that might be in the list
if(list.Any(x=>x.Equals(element))
{
  //do something
}

它仍然与您习惯的相反,但它更具表现力(如果列表中有任何等于元素的值(。

假设您的意思是&amp;而不是||,您只需编写一个func并在整个代码中使用它。您可以缩短新的[]部分,因为类型(int(是由func的in参数推断的。

Func<int, bool> IsSafe = x => !new[] { 2, 3, 61, 71 }.Contains(x);
Console.WriteLine(IsSafe(68)); // is true
Console.WriteLine(IsSafe(2));  // is false