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[] { ... }))
左右?
嗯。。有什么建议吗?有吗。网络标准方法来测试这样的东西?
我使用一个扩展方法:
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
}
它仍然与您习惯的相反,但它更具表现力(如果列表中有任何等于元素的值(。
假设您的意思是&;而不是||,您只需编写一个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