Подтвердить что ты не робот

С#: Самый элегантный способ проверить, является ли int x элементом данного набора?

Задача: проверить, если 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 не является элементом...", который трудно выразить на С# без раздражающих накладных расходов. Может быть, один coud скажет if (Object(x).IsElementOf(new[] { ... })) или так?

Хм.. любые предложения? Существуют ли какие-либо стандартные методы .NET для проверки таких вещей?

4b9b3361

Ответ 1

Я использую метод расширения:

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, если вы предпочитаете это имя...

Ответ 2

Вы можете использовать следующий метод 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

Ответ 3

Старый вопрос, но не видел этого простого ответа:

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

Ответ 4

как насчет

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

или что-то в этих строках?

Ответ 5

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
}

Он по-прежнему инвертирован от того, к чему вы привыкли, но более выразителен (если в списке есть любое значение, равное элементу).

Ответ 6

Предполагая, что вы имели в виду && а не ||, вы можете просто написать func и использовать это во всем своем коде. Вы можете сократить новую часть [], так как тип (int) выводится параметром in func.

Func<int, bool> IsSafe = x => !new[] { 2, 3, 61, 71 }.Contains(x);

Console.WriteLine(IsSafe(68)); // is true
Console.WriteLine(IsSafe(2));  // is false