c # enum исключить - PullRequest
       1

c # enum исключить

7 голосов
/ 21 марта 2011

Допустим, у меня есть такое перечисление:

[Flags]
public enum NotificationMethodType {
    Email = 1,
    Fax = 2,
    Sms = 4
}

И скажем, у меня есть переменная, определенная как:

NotificationMethodType types = (NotificationMethodType.Email | NotificationMethodType.Fax)

Как мне выяснить все значения NotificationMethodType, которые не определены в переменной «types»? Другими словами:

NotificationMethodType notAssigned = NotificationMethodType <that are not> types

Ответы [ 3 ]

15 голосов
/ 21 марта 2011

Если список типов никогда не изменяется, вы можете сделать это:

NotificationMethodType allTypes = NotificationMethodType.Email |
    NotificationMethodType.Fax |
    NotificationMethodType.Sms;

NotificationMethodType notAssigned = allTypes & ~types;

~ создает обратное значение, инвертируя все биты.

Типичный способ определить такоеперечисления, чтобы хотя бы сохранить определение «allTypes», локальное для перечисления, означало бы включение двух новых имен в перечисление:

[Flags]
public enum NotificationMethodType {
    None = 0,
    Email = 1,
    Fax = 2,
    Sms = 4,
    All = Email | Fax | Sms
}

Примечание : если вы идете по пути добавлениязначение All для перечисления, обратите внимание, что если бы types было пустым, вы бы не получили перечисление, которое напечатало бы как «электронная почта, факс, смс», а скорее как «все».

Если вы не хотите вручную вести список allTypes, вы можете сделать это, используя метод Enum.GetValues:

NotificationMethodType allTypes = 0;
foreach (NotificationMethodType type in Enum.GetValues(typeof(NotificationMethodType)))
    allTypes |= type;

, или вы можете сделать то же самое с LINQ:

NotificationMethodType allTypes = 
    Enum.GetValues(typeof(NotificationMethodType))
    .Cast<NotificationMethodType>()
    .Aggregate ((current, value) => current | value);

Это строит значение allType, объединяя все отдельные значения перечисления ИЛИ.

3 голосов
/ 21 марта 2011

Простой XOR сделает свое дело ...

    NotificationMethodType all = (NotificationMethodType.Email | NotificationMethodType.Fax | NotificationMethodType.Sms);
    NotificationMethodType used = (NotificationMethodType.Email | NotificationMethodType.Fax);
    NotificationMethodType unused = (all ^ used);

Чтобы сделать это немного чище, добавьте значение All в определение enum напрямую (очевидно, установите значение 7).Таким образом, вы можете добавить вещи в перечисление позже, не нарушая этот код

0 голосов
/ 21 марта 2011
var notAssigned = Enum.GetValues(typeof(NotificationMethodType))
                      .Cast<NotificationMethodType>()
                      .Where(x => !types.HasFlag(x))
                      .Aggregate((a, x) => a | x);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...