问题:测试是否 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[] { ... }))
或者这样?
有什么建议吗?是否有任何 .Net 标准方法来测试此类内容?
我使用扩展方法:
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)
从 C# 9 版本开始,您也可以使用逻辑模式。
if (x is not (2 or 3 or 61 or 71))
{
// do things
}
您可以使用以下 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 并在整个代码中使用它。您可以缩短 new[] 部分,因为类型 (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