#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 IEnumerableWith(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) { IQueryablequeryable = 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
Комментариев нет:
Отправить комментарий