Я понимаю, что вы можете настроить флаги перечисления C # следующим образом:

    [Flags]
    public enum MyEnum
    {
        Unknown = 0,
        Type1 = 1,
        Type2 = 2,
        Type3 = 4,
        Type4 = 8,
        Type5 = 16
    }

И как только это настроено, вы можете представить набор перечислений, например, так:

MyEnum enumerationSet = MyEnum.Type1 | MyEnum.Type2

Затем вы можете выполнить проверку по этому набору, например:

if(enumerationSet.HasFlag(MyEnum.Type1))
{
  // Do something
}

Или выведите их значения так:

Console.WriteLine("{0}", enumerationSet);

Который напечатал бы:

Type1, Type2

Тем не менее, я могу пойти в обратном порядке? Например, если я знаю, что

MyEnum.Type1 | MyEnum.Type2 == 3

Могу ли я тогда спросить MyEnum, какой набор его значений / типов будет равен 3? Затем я могу создать метод расширения (GetSet) для выполнения следующим образом:

List<MyEnum> myEnumSetList = MyEnum.GetSet(3)

Возвращает либо MyEnum набор, либо набор значений, т.е. {1, 2}.

Пожалуйста, порекомендуйте.


РЕДАКТИРОВАТЬ: я смог наконец понять это. Разместил мой ответ ниже.

5
Rick 3 Сен 2017 в 20:02

3 ответа

Лучший ответ

После некоторого взлома мне удалось разрешить список значений перечисления, основываясь на значении этого соответствующего набора ИЛИ:

protected List<MyEnum> GetEnumSet(int flagNumber)
{
      List<MyEnum> resultList= new List<MyEnum>();

      foreach (MyEnum value in Enum.GetValues(typeof(MyEnum)))
      {
         if (((MyEnum)flagNumber).HasFlag(value))
         {
             resultList.Add(value);
         }
      }

      return resultList;
}

Здесь flagNumber является значением соответствующего списка OR, т.е. MyEnum.Type1 | MyEnum.Type2 . Таким образом, отправляя этот метод flagNumber, я получаю список { MyEnum.Type1, MyEnum.Type2 }

0
Rick 4 Окт 2017 в 01:45

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

var f = 1 + 4 + 8;
var s = Convert.ToString(f, 2);
var flags =
    s.Where(w=> w !='0').Select(
        (c, i) =>
            (MyEnum)Enum.Parse(typeof(MyEnum),
                    (int.Parse(c.ToString())*Math.Pow(2, i)).ToString(CultureInfo.InvariantCulture)));
0
shA.t 3 Сен 2017 в 17:14

Вы можете разобрать его вручную с помощью этого кода:

    var res = 3;
    var myEnumSetList = res.ToString()
              .Split(new[] { ", " }, StringSplitOptions.None)
              .Select(v => (MyEnum)Enum.Parse(typeof(MyEnum), v)).ToList();
0
Christian Müller 3 Сен 2017 в 17:14