2009-11-17 5 views
24

LINQ 확장 메서드를 사용할 수있는 열거 형 (아래)이 있습니다.Enum의 IEnumerable 확장 메서드

enum Suit{ 
    Hearts = 0, 
    Diamonds = 1, 
    Clubs = 2, 
    Spades = 3 
} 

Enum.GetValues ​​(...)는 반환 형식 System.Array입니다,하지만 난 ToList() 확장 또는 그런 종류의 무엇에 접근 할 수없는 것.

난 그냥 뭔가를 쓰고 찾고 있어요 ...

foreach(Suit s in Enum.GetValues(typeof(Suit)).Select(x=>x).Where(x=> x != param)){} 

는 내가 부족 뭔가가 있나요, 또는 이것이 가능하지 않은 이유는 누군가가 나에게 설명 할 수 있습니까?

감사합니다.

답변

41

Enum.GetValuesSystem.ArraySystem.Array은 그래서 당신은이 같은 IEnumerable<Suit>IEnumerable을 변환 할 Enumerable.OfType 확장 메서드를 사용해야합니다 IEnumerable 오히려 IEnumerable<T>보다 구현 반환 내가 전화를 제거 : 편집

Enum.GetValues(typeof(Suit)) 
      .OfType<Suit>() 
      .Where(x => x != param); 

의미있는 번역이없는 불필요한 투영 이었기 때문에 IEnumerable.Select으로 변경되었습니다. OfType<T>에서 반환되는 IEnumerable<Suit>을 자유롭게 필터링 할 수 있습니다.

+1

목록을 필터링 할 때 'OfType'이 더 적합하고 캐스팅을 위해 'Cast'가 표시되는 경향이 있습니다. 'Suit '보다는'Int32'를 사용해야 할 이유가 있습니까? –

+0

동종 유형을 포함하는 모든 IEnumerable의 경우 OfType 및 캐스트은 사실상 동일하게 작동하고 작동합니다. 'Suit'보다는'Int32'를 사용하는 것에 관해서는 왜 내가 그렇게했는지 정말로 모르겠습니다 - 제 대답이 바로 잡혔습니다. –

+0

찾고있는 것처럼 작동합니다. 감사! – ahawker

7

배열은 IEnumerable을 구현하므로 Cast<Suit> 또는 OfType<Suit>을 사용하여 ToList()와 같은 IEnumerble<T> 확장자를 가져와야합니다.