IEnumerable методы расширения для перечисления - PullRequest
25 голосов
/ 18 ноября 2009

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

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)){}

Что-то я упускаю, или кто-то может объяснить мне, почему это невозможно?

Спасибо.

Ответы [ 2 ]

42 голосов
/ 18 ноября 2009

Enum.GetValues возвращает System.Array и System.Array только реализует IEnumerable вместо IEnumerable<T>, поэтому вам нужно будет использовать метод расширения Enumerable.OfType для преобразовать IEnumerable в IEnumerable<Suit> так:

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

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

7 голосов
/ 18 ноября 2009

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

...