var query = Enum.GetValues(typeof(MyEnum))
.Cast<MyEnum>()
.Except(new MyEnum[] { MyEnum.A, MyEnum.E });
foreach (MyEnum item in query) {
...
}
Musisz rzucać w celu uzyskania magii LINQ. Except
sam nie zrobi tego.
UPDATE:
mam inny pomysł. Możesz zdefiniować enum z FlagsAttribute
i zdefiniować regularne wartości jako moce 2, co jest najłatwiejsze z operatorem przesunięcia bitowego w lewo o <<
. Począwszy od wersji C# 7.0, można również używać literałów binarnych, takich jak 0b_0000_0000_0010_0000
. Następnie możliwe jest połączenie istniejących wartości w celu utworzenia nowych wartości.
[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
}
Teraz można sformułować zapytanie jak ten
IEnumerable<MyEnum> query = Enum.GetValues(typeof(MyEnum))
.Cast<MyEnum>()
.Where(x => (x & MyEnum.Vowels) == MyEnum.None);
foreach (MyEnum item in query) {
...
}
przewagę nad pierwszym rozwiązaniem jest, że można wykonać test z jednym bitowe AND operacji.
Możesz zdefiniować do 32 potęg dwóch. Jeśli potrzebujesz więcej, możesz zdefiniować podstawowy typ wyliczenia jako long
i użyć maksymalnie 64 wartości flag (plus kombinacji istniejących wartości flag).
[Flags]
enum MyEnum : long
{
...
}
Jest to prawdopodobnie najbardziej kompletna odpowiedź. Najłatwiejszą rzeczą do zrobienia jest określenie różnych kolekcji Enums, które chcesz pominąć, w ten sposób możesz zapisać te kolekcje pominięć i spełnić dowolne kryteria w Except. – SPFiredrake
Tak, można również zachować różne zapytania. –
Dodałem kolejne rozwiązanie, używając tylko bitowego AND, aby wykonać test. Nie wymaga żadnych tablic ani HashSets dla wyjątkowych wartości. Zobacz moją aktualizację. –