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

Самый эффективный способ анализа помеченного значком списка в список

У меня есть флажок с перечислением и вам нужно получить имена всех значений, установленных на нем.

В настоящее время я использую метод перечисления ToString(), который возвращает элементы, разделенные запятыми.

    public void SetRoles(Enums.Roles role)
    {
        IList<Entities.Role> roleList = role.ToString("G").Split(',')
            .Select(r => new Entities.Role(r.Trim()))
            .ToList();
    ...
    }

Я уверен, что должен быть лучший способ, чем это.

4b9b3361

Ответ 1

Хороший вопрос!

Я не могу думать ни о чем лучше, чем:

public void SetRoles(Enums.Roles role)
{
  List<string> result = new List<string>();
  foreach(Roles r in Enum.GetValues(typeof(Roles))
  {
    if ((role & r) != 0) result.Add(r.ToString());
  }
}

Ответ 2

Если вам действительно просто нужны строки, не может быть намного проще, чем:

string[] flags = role.ToString().Split(',');

Это проще, чем использование LINQ и все еще только одна строка кода. Или, если вам нужен список вместо массива, как в примере в вопросе, вы можете преобразовать массив в список:

List<string> flags = new List<string>(role.ToString().Split(','));

В моем случае мне понадобилось общее решение и придумал следующее:

value.ToString().Split(',').Select(flag => (T)Enum.Parse(typeof(T), flag)).ToList();

Ответ 3

Enum.Parse будет обрабатывать конкатенированные значения, выводимые ToString, в порядке. Доказательство с использованием окна Immediate:

? System.Enum.Parse(typeof(System.AttributeTargets), "Class, Enum")
Class | Enum

(вторая строка - это выход, который отличается в отладчике/немедленном окне из общего выхода Enum.ToString()).

Ответ 4

Зачем вам нужен список? Все уже сохранено в флагах:

[Flags]
enum Roles
{
    Read = 0x1,
    Write = 0x2,
    Delete = 0x4,
}

Затем назначьте роли:

var roles = Roles.Read | Roles.Write;

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

if ((roles & Roles.Read) == Roles.Read)
{
    // The user has read permission
}
if ((roles & Roles.Write) == Roles.Write)
{
    // The user has write permission
}