С#: Самый элегантный способ проверить, является ли 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 для проверки таких вещей?
Ответы
Ответ 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