C #: Самый элегантный способ проверить, является ли int x элементом данного набора? - PullRequest
25 голосов
/ 22 ноября 2011

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

Ответы [ 6 ]

43 голосов
/ 22 ноября 2011

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

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

7 голосов
/ 20 сентября 2014

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

!new []{2, 3, 61, 71}.Contains(x)
5 голосов
/ 22 ноября 2011

Вы можете использовать следующий метод 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
1 голос
/ 22 ноября 2011

как насчет

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

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

0 голосов
/ 22 ноября 2011

Предполагая, что вы имели в виду &&, а не ||, вы можете просто написать функцию и использовать ее в своем коде.Вы можете сократить новую часть [], так как тип (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
0 голосов
/ 22 ноября 2011
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
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...