Подтвердить что ты не робот

Сравнение переменной с несколькими значениями

Довольно часто в моем коде мне нужно сравнить переменную с несколькими значениями:

if ( type == BillType.Bill || type == BillType.Payment || type == BillType.Receipt )
{
  // Do stuff
}

Я продолжаю думать, что могу:

if ( type in ( BillType.Bill, BillType.Payment, BillType.Receipt ) )
{
   // Do stuff
}

Но, конечно, это SQL, который позволяет это.

В С# есть более аккуратный способ?

4b9b3361

Ответ 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.