2009-11-17 3 views
24

У меня есть перечисление (ниже), в котором я хочу использовать метод расширения LINQ.IEnumerable Extension Methods on Enum

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.GetValues возвращает System.Array и System.Array реализует только IEnumerable, а не IEnumerable<T> так что вам нужно будет использовать метод Enumerable.OfType расширения для преобразования IEnumerable в IEnumerable<Suit> так:

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

Edit: Я удалил вызов до IEnumerable.Select, поскольку это была излишняя проекция без какого-либо значимого перевода. Вы можете свободно фильтровать IEnumerable<Suit>, который возвращается с OfType<T>.

+1

Я склонен видеть, что 'OfType' более уместен, когда вы хотите отфильтровать список и' Cast' для кастинга. Есть ли причина использовать 'Int32', а не' Suit'? –

+0

Для любого 'IEnumerable', который содержит однородные типы,' OfType 'и' Cast 'будут выполнять и вести себя практически одинаково. Что касается использования 'Int32', а не' Suit', я не совсем уверен, почему я это сделал - мой ответ был исправлен. –

+0

Работает точно так же, как я искал. Благодаря! – ahawker

7

Array реализует IEnumerable, поэтому вам нужно использовать Cast<Suit> или OfType<Suit>, чтобы получить расширения IEnumerble<T>, такие как ToList();