var query = Enum.GetValues(typeof(MyEnum))
.Cast<MyEnum>()
.Except(new MyEnum[] { MyEnum.A, MyEnum.E });
foreach (MyEnum item in query) {
...
}
Sen LINQ sihirli almak için döküm gerekir. Except
tek başına bunu yapmayacaktır.
GÜNCELLEME:
bir fikrim daha var. Sen FlagsAttribute
ile enum tanımlamak ve 2'nin güçler olarak düzenli değerlerini tanımlayabilir, en kolay bitsel kaydırılmasıyla elde ne operatörü <<
bıraktı. C# 7.0 ile başlayarak, 0b_0000_0000_0010_0000
gibi ikili değişmezleri de kullanabilirsiniz. Daha sonra mevcut değerleri yeni değerler oluşturmak için birleştirmek mümkündür.
[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
}
Şimdi, tek bir bitsel VE-çalışmasıyla testini gerçekleştirebileceği, birinci çözümün üzerinde avantajdır bu
IEnumerable<MyEnum> query = Enum.GetValues(typeof(MyEnum))
.Cast<MyEnum>()
.Where(x => (x & MyEnum.Vowels) == MyEnum.None);
foreach (MyEnum item in query) {
...
}
benzeri bir sorgu formüle edebilirsiniz.
İkide 32 güçlere tanımlayabilirsiniz. Eğer daha fazla gerekiyorsa, long
olarak enum taban türünü tanımlamak ve 64 bayrak değerlerinin (artı mevcut bayrak değerlerinin kombinasyonları) kadar kullanabilirsiniz.
[Flags]
enum MyEnum : long
{
...
}
Bu muhtemelen en eksiksiz yanıttır. Buradan yapılacak en kolay şey, kurtulacaksın bu atlama koleksiyonları sahip olabilir ve dışında istediğimi kriterler içinde geçebilir bu şekilde atlamak isteyeyim numaralamalar çeşitli koleksiyonları belirtmektir. – SPFiredrake
Evet ve çeşitli sorguları da tutabilirsiniz. –
Testi yapmak için sadece bir bitsel AND kullanarak başka bir çözüm daha ekledim. Olağanüstü değerler için diziler veya HashSets gerektirmez. Lütfen güncellemeye bakın. –