var query = Enum.GetValues(typeof(MyEnum))
.Cast<MyEnum>()
.Except(new MyEnum[] { MyEnum.A, MyEnum.E });
foreach (MyEnum item in query) {
...
}
Вам нужно разыграть, чтобы получить магию LINQ.Except
сам по себе этого не сделает.
ОБНОВЛЕНИЕ:
У меня есть другая идея.Вы можете определить перечисление с помощью FlagsAttribute
и определить регулярные значения как степени 2, чего легче всего достичь с помощью оператора побитового сдвига влево <<
.Начиная с C # 7.0, вы также можете использовать двоичные литералы, такие как 0b_0000_0000_0010_0000
.Затем можно объединить существующие значения для формирования новых значений.
[Flags]
enum MyEnum
{
None = 0,
A = 1 << 0,
B = 1 << 1,
C = 1 << 2,
D = 1 << 3,
E = 1 << 4,
...
X = 1 << 23,
Y = 1 << 24,
Z = 1 << 25,
Vowels = A | E | I | O | U
}
Теперь вы можете сформулировать запрос следующим образом:
IEnumerable<MyEnum> query = Enum.GetValues(typeof(MyEnum))
.Cast<MyEnum>()
.Where(x => (x & MyEnum.Vowels) == MyEnum.None);
foreach (MyEnum item in query) {
...
}
Преимущество перед первым решением состоит в том, что выможет выполнить тест с одной побитовой операцией AND.
Вы можете определить до 32 степеней двух.Если вам нужно больше, вы можете определить базовый тип перечисления как long
и использовать до 64 значений флага (плюс комбинации существующих значений флага).
[Flags]
enum MyEnum : long
{
...
}