Упростите 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.
}
Я думаю, если бы у вас был очень длинный список возможных значений, то подход массива намного лучше.