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

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

Я часто нахожу, что пишу код, где переменная может быть либо 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 (..), есть ли что-то подобное в С#?

WHERE x IN(1,2)

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

Ответы

Ответ 1

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

// 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 для целых чисел и перечислений имеет специальную обработку ИЛ через прыжки-таблицы, что делает ее очень эффективной:

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

Ответ 2

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

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

И назовите его следующим образом:

1.In(2,3,4)

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

Ответ 3

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

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

Ответ 4

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

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))
{
      // ...
}

Ответ 5

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

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

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

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

Ответ 6

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

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

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

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