Самый эффективный способ анализа помеченного значком списка в список
У меня есть флажок с перечислением и вам нужно получить имена всех значений, установленных на нем.
В настоящее время я использую метод перечисления ToString(), который возвращает элементы, разделенные запятыми.
public void SetRoles(Enums.Roles role)
{
IList<Entities.Role> roleList = role.ToString("G").Split(',')
.Select(r => new Entities.Role(r.Trim()))
.ToList();
...
}
Я уверен, что должен быть лучший способ, чем это.
Ответы
Ответ 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
}