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