var query = Enum.GetValues(typeof(MyEnum))
.Cast<MyEnum>()
.Except(new MyEnum[] { MyEnum.A, MyEnum.E });
foreach (MyEnum item in query) {
...
}
È necessario lanciare al fine di ottenere la magia di LINQ. Except
da solo non lo farà.
UPDATE:
ho avuto un'altra idea. È possibile definire l'enumerazione con lo FlagsAttribute
e definire i valori normali come potenze di 2, ciò che si ottiene più facilmente con l'operatore di spostamento bit a bit di sinistra <<
. A partire da C# 7.0, puoi anche utilizzare valori letterali binari come 0b_0000_0000_0010_0000
. Quindi è possibile combinare i valori esistenti per formare nuovi valori.
[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
}
Ora, è possibile formulare la query come questa
IEnumerable<MyEnum> query = Enum.GetValues(typeof(MyEnum))
.Cast<MyEnum>()
.Where(x => (x & MyEnum.Vowels) == MyEnum.None);
foreach (MyEnum item in query) {
...
}
Il vantaggio rispetto alla prima soluzione è, che è possibile eseguire il test con un singolo bit per bit AND-operazione.
È possibile definire fino a 32 potenze di due. Se è necessario altro, è possibile definire il tipo di base dell'enumerazione come long
e utilizzare fino a 64 valori di flag (più combinazioni di valori di flag esistenti).
[Flags]
enum MyEnum : long
{
...
}
fonte
2012-03-12 17:40:14
Questa è probabilmente la risposta più completa. La cosa più facile da fare qui è specificare varie raccolte di Enum che vorresti saltare, in questo modo puoi avere quelle raccolte di salto salvate e possono passare in qualsiasi criterio tu voglia in Tranne. – SPFiredrake
Sì, e puoi anche mantenere varie domande. –
Ho aggiunto un'altra soluzione utilizzando solo un AND a bit per eseguire il test. Non richiede alcun array o Hashset per i valori eccezionali. Si prega di consultare il mio aggiornamento. –