Сравнение переменной с несколькими значениями
Довольно часто в моем коде мне нужно сравнить переменную с несколькими значениями:
if ( type == BillType.Bill || type == BillType.Payment || type == BillType.Receipt )
{
// Do stuff
}
Я продолжаю думать, что могу:
if ( type in ( BillType.Bill, BillType.Payment, BillType.Receipt ) )
{
// Do stuff
}
Но, конечно, это SQL, который позволяет это.
В С# есть более аккуратный способ?
Ответы
Ответ 1
Вы можете сделать это с помощью. Содержит следующие действия:
if(new[]{BillType.Receipt,BillType.Bill,BillType.Payment}.Contains(type)){}
Или создайте свой собственный метод расширения, который сделает это с помощью более читаемого синтаксиса
public static class MyExtensions
{
public static bool IsIn<T>(this T @this, params T[] possibles)
{
return possibles.Contains(@this);
}
}
Затем назовите его:
if(type.IsIn(BillType.Receipt,BillType.Bill,BillType.Payment)){}
Ответ 2
Там также оператор switch
switch(type) {
case BillType.Bill:
case BillType.Payment:
case BillType.Receipt:
// Do stuff
break;
}
Ответ 3
Предполагаемый тип - это перечисление, вы можете использовать FlagsAttribute:
[Flags]
enum BillType
{
None = 0,
Bill = 2,
Payment = 4,
Receipt = 8
}
if ((type & (BillType.Bill | BillType.Payment | BillType.Receipt)) != 0)
{
//do stuff
}
Ответ 4
Попробуйте использовать переключатель
switch (type)
{
case BillType.Bill:
case BillType.Payment:
break;
}
Ответ 5
Попробуйте использовать С# HashSet для списка значений. Это может быть особенно полезно, если вам нужно сравнить многие значения с одним набором значений.
Ответ 6
Попробуйте проверить шаблон разработки стратегии (a.k.a. шаблон разработки политики).
public interface IBillTypePolicy
{
public BillType { get; }
void HandleBillType();
}
public class BillPolicy : IBillTypePolicy
{
public BillType BillType { get { return BillType.Bill; } }
public void HandleBillType()
{
// your code here...
}
}
Здесь отличный пост о том, как динамически разрешать политику от Los Techies.
Ответ 7
Как получить массив всех значений Enums и перебрать его?
http://maniish.wordpress.com/2007/09/27/iterate-through-enumeration-c/