2009-11-17 8 views
24

Ich habe eine enum (unten), dass ich in der Lage sein, eine LINQ-Erweiterung-Methode zu verwenden.IEnumerable Extension Methoden auf einer Enum

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

Enum.GetValues ​​(...) ist der Rückgabetyp System.Array, aber ich kann keinen Zugriff auf einen ToList() die Verlängerung oder etwas anderes scheinen von dieser Art zu erhalten.

Ich bin nur so etwas wie zu schreiben ...

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

Gibt es etwas, was ich bin fehlt, oder kann mir jemand erklären, warum dies nicht möglich ist?

Danke.

Antwort

41

Enum.GetValues gibt ein System.Array und System.Array nur implementiert IEnumerable statt IEnumerable<T> so werden Sie die Enumerable.OfType Extension-Methode verwenden, um den IEnumerable-IEnumerable<Suit> so zu konvertieren:

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

Edit: ich den Anruf entfernt zu IEnumerable.Select als es eine überflüssige Projektion ohne irgendeine sinnvolle Übersetzung war. Sie können die IEnumerable<Suit>, die von OfType<T> zurückgegeben wird, frei filtern.

+1

Ich sehe 'OfType' eher zum Filtern von Listen und' Cast' zum Casting. Gibt es einen Grund, "Int32" anstelle von "Suit" zu verwenden? –

+0

Für 'IEnumerable', die homogene Typen enthalten, werden' OfType 'und' Cast 'nahezu identisch ausgeführt und verhalten sich. Was die Verwendung von "Int32" anstelle von "Suit" betrifft, bin ich nicht wirklich sicher, warum ich das getan habe - meine Antwort wurde korrigiert. –

+0

Funktioniert genau wie ich gesucht habe. Vielen Dank! – ahawker

7

Array implementiert IEnumerable, so müssen Sie Cast<Suit> oder OfType<Suit> verwenden, um die IEnumerble<T> Erweiterungen wie ToList() zu erhalten;