Упростите, если (x == 1 || x == 2)

Возможный дубликат:
C# если операторы, соответствующие нескольким значениям

Я часто пишу код, в котором переменная может быть A или B, например, когда я вызываю OnItemDataBound для повторителя:

protected void repeater_OnItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {}
}

Я тогда часто думаю, что должен быть более простой способ сделать это. Я хотел бы написать что-то вроде:

if(x == (1 || 2))

В SQL есть оператор IN(..), есть ли что-то похожее в C#?

WHERE x IN(1,2)

Я знаю, что вместо этого могу использовать оператор switch, но это не так просто. Я хочу, чтобы это было сделано в операторе If, если это возможно.

6 ответов

Я думаю, что это нормально, как есть; Тем не менее, вы можете сделать что-то вроде:

// note the array is actually mutable... just... don't change the contents ;p
static readonly ListItemType[] specialTypes =
     new[]{ListItemType.Item, ListItemType.AlternatingItem};

и проверить против:

if(specialTypes.Contains(e.Item.ItemType)) {
    // do stuff
}

Но чтобы подчеркнуть: я бы на самом деле просто использовал switch здесь, как switch для целых и перечислений имеет специальную обработку IL через таблицы переходов, что делает его очень эффективным:

switch(e.Item.ItemType) {
    case ListItemType.Item:
    case ListItemType.AlternatingItem:
       // do stuff
       break;
}

Вы можете написать метод расширения следующим образом:

public static bool In<T>(this T x, params T[] values)
{
  return values.Contains(x);
}

И назовите это так:

1.In(2,3,4)

Но я бы сказал, что это не стоит усилий.

Если вы хотите имитировать оператор SQL IN, вы можете сделать что-то вроде этого... для простого случая с двумя элементами это, вероятно, не проще, но для большего количества элементов это, безусловно, будет.

(new[] { 1, 2 }).Contains(x);

Вы можете использовать следующий метод, найденный в этом ответе

public static bool In<T>(this T source, params T[] list)
{
  if(null==source) throw new ArgumentNullException("source");
  return list.Contains(source);
}

Звоните так:

if(x.In(1,2,4))
{
      // ...
}

Если нет слишком много возможных вариантов для одного if, ваш код читабелен и понятен, что является наиболее важным.

Если вы часто встречаетесь if с более чем 3 условия, вы можете использовать

new List<..>{ condition1, condition2, ... ConditionN}.Any<>(),

Что-то вроде того.

Я думаю, что это так просто, как вы собираетесь получить. Обратите внимание, что другие ответы или даже ваше собственное предложение на самом деле используют специальные конструкции и обходные пути только для того, чтобы сократить какой-то тривиальный бит синтаксиса. Кроме того, эти умные обходные пути будут препятствовать производительности.

Но для двух-трех элементов, которые занимают много места, я хотел бы поместить условия в последующие строки, чтобы сделать чтение немного легче.

if (x == MyEnum.SomeReallyLongNameThatEatsUpTheLine ||
    x == MyEnum.TheOtherNameThatWastesSpace)
{
// The simplest code.
}

Я думаю, если бы у вас был очень длинный список возможных значений, подход с использованием массива был бы намного лучше.

Другие вопросы по тегам