Страницы

Поиск по вопросам

вторник, 28 января 2020 г.

Enum Flags получить все возможные комбинации с установленным значением

#c_sharp #enum


Есть такой Enum:

[Flags]
public enum TypeMoEnum :  long
{
    [EnumMember]
    NotDefined = 0,
    [EnumMember]
    MO = 1,
    [EnumMember]
    Federal = 2,
    [EnumMember]
    Laboratory = 4,
    [EnumMember]
    CallCentre = 8,
    [EnumMember]
    ForRouteCard = 16
}


нужно получить все возможные комбинации чисел, которые определяли наличие выбранного
члена ForRouteCard. Как это можно было бы реализовать ?

UPD:
Условие >= 16 не подойдет, т.к. в дальнейшем могут быть добавлены другие члены енама
32,64 и.т.д
    


Ответы

Ответ 1



При условии, что TypeMoEnum.ForRouteCard - последний флаг в enum, и что нужно перебрать только те значения, которые отображаются на enum: var values = Enumerable.Range((int)TypeMoEnum.ForRouteCard, (int)TypeMoEnum.ForRouteCard) .Select(i => (TypeMoEnum)i); foreach (var v in values) { Console.WriteLine(v); } Если флаг не последний, то long maxEnumValue = Enum.GetValues(typeof(TypeMoEnum)) .Cast() .Aggregate(0, (long a, long b) => a | b); for (long val = (long)TypeMoEnum.ForRouteCard; val <= maxEnumValue; val++) { if ((val & (long)TypeMoEnum.ForRouteCard) != 0) { Console.WriteLine((TypeMoEnum)val); } }

Ответ 2



http://ideone.com/Ptvgnu private static IEnumerable With(TypeMoEnum value) { long lim = Enum.GetValues(typeof(TypeMoEnum)).OfType().Max(x => (long)x)<<1; long val = (long)value, step = val<<1; for (long l=val; l

Ответ 3



Если конечная цель выбрать данные из БД, у которых установлен соответствующий флаг - используйте побитовое И: static void Main(string[] args) { Console.WriteLine((17 & (long)TypeMoEnum.ForRouteCard) > 0); Console.WriteLine((15 & (long)TypeMoEnum.ForRouteCard) > 0); Console.WriteLine((31 & (long)TypeMoEnum.ForRouteCard) > 0); Console.WriteLine((48 & (long)TypeMoEnum.ForRouteCard) > 0); Console.WriteLine((47 & (long)TypeMoEnum.ForRouteCard) > 0); Console.WriteLine((117 & (long)TypeMoEnum.ForRouteCard) > 0); Console.ReadLine(); } Вывод: True False True True False True Пример использования в запросах: static void Main(string[] args) { IQueryable queryable = new List { (TypeMoEnum)17, (TypeMoEnum)15, (TypeMoEnum)31, (TypeMoEnum)48, (TypeMoEnum)47, (TypeMoEnum)117 }.AsQueryable(); foreach (var q in queryable.Where(v => (v & TypeMoEnum.ForRouteCard) > 0)) Console.WriteLine((long)q); Console.ReadLine(); } Вывод: 17 31 48 117 Можно даже сообразить метод или метод-расширение, для проверки флага, который передавать в параметре, но сейчас код не приведу, так как не на чем проверить возможные нюансы с Expression<> в IQueryable

Комментариев нет:

Отправить комментарий