测试 int x 是否是给定集合的元素的最优雅的方法? [已关闭]

问题描述 投票:0回答:8

问题:测试是否 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 标准方法来测试此类内容?

c# .net coding-style
8个回答
53
投票

我使用扩展方法:

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


18
投票

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

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

7
投票

从 C# 9 版本开始,您也可以使用逻辑模式。

if (x is not (2 or 3 or 61 or 71))
{
    // do things
}

6
投票

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

2
投票

怎么样

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

或者这些方面的东西?


1
投票

原来2、3、61、71都是素数。因此,将您的数字取模为 25986 (= 2 * 3 * 61 * 71)。如果结果非零,则继续 if 块。

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

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


0
投票
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
}

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


0
投票

假设您的意思是 && 而不是 ||,您可以编写一个 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
© www.soinside.com 2019 - 2024. All rights reserved.