var query = Enum.GetValues(typeof(MyEnum))
.Cast<MyEnum>()
.Except(new MyEnum[] { MyEnum.A, MyEnum.E });
foreach (MyEnum item in query) {
...
}
당신은 LINQ의 마법을 얻기 위해 캐스팅해야합니다. Except
만으로는 작동하지 않습니다.
UPDATE :
나는 다른 생각이있어. 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
}
지금, 당신은 당신이 하나의 비트 AND-작업과 테스트를 수행 할 수있는, 최초의 솔루션을 통해 장점은이
IEnumerable<MyEnum> query = Enum.GetValues(typeof(MyEnum))
.Cast<MyEnum>()
.Where(x => (x & MyEnum.Vowels) == MyEnum.None);
foreach (MyEnum item in query) {
...
}
같은 쿼리를 공식화 할 수 있습니다.
최대 32 개의 지수를 정의 할 수 있습니다. 더 많은 정보가 필요하면 enum의 기본 유형을 long
으로 정의하고 최대 64 개의 플래그 값 (기존 플래그 값의 조합)을 사용할 수 있습니다.
[Flags]
enum MyEnum : long
{
...
}
아마도 가장 완벽한 답변 일 것입니다. 여기에서하는 가장 쉬운 방법은 생략하려는 열거 형 컬렉션을 지정하는 것입니다. 그런 식으로 건너 뛰기 컬렉션을 저장하고 Except에서 원하는 모든 조건을 전달할 수 있습니다. – SPFiredrake
예, 다양한 쿼리를 보관할 수도 있습니다. –
비트 앤드 만 사용하여 테스트를 만드는 또 다른 솔루션을 추가했습니다. 예외적 인 값을 위해 배열이나 HashSet을 필요로하지 않습니다. 내 업데이트를 참조하십시오. –