wake-up-neo.com

Funktioniert LINQ mit IEnumerable?

Ich habe eine Klasse, die IEnumerable implementiert, aber nicht IEnumerable<T> Implementiert. Ich kann diese Klasse nicht ändern und ich kann stattdessen keine andere Klasse verwenden. Wie ich von MSDN verstanden habe LINQ kann verwendet werden, wenn die Klasse IEnumerable<T> Implementiert . Ich habe versucht, instance.ToQueryable() zu verwenden, aber es aktiviert immer noch keine LINQ-Methoden. Ich weiß mit Sicherheit, dass diese Klasse Instanzen nur eines Typs enthalten kann, sodass die Klasse IEnumerable<T> Implementieren könnte, aber dies ist einfach nicht der Fall. Was kann ich also tun, um diese Klasse mit LINQ-Ausdrücken abzufragen?

78

Sie können Cast<T>() oder OfType<T> Verwenden, um eine generische Version einer IEnumerable abzurufen, die LINQ vollständig unterstützt.

Z.B.

IEnumerable objects = ...;
IEnumerable<string> strings = objects.Cast<string>();

Oder wenn Sie nicht wissen, welchen Typ er enthält, können Sie immer Folgendes tun:

IEnumerable<object> e = objects.Cast<object>();

Wenn Ihr nicht generisches IEnumerable Objekte verschiedener Art enthält und Sie nur an zB interessiert sind. die Saiten, die du machen kannst:

IEnumerable<string> strings = objects.OfType<string>();
125
DeCaf

Ja, kann es. Sie müssen nur die Funktion Cast verwenden, um sie in einen eingegebenen IEnumerable<T> Umzuwandeln. Beispielsweise

IEnumerable e = ...;
IEnumreable<object> e2 = e.Cast<object>();

Jetzt ist e2 Ein IEnumerable<T> Und kann mit allen LINQ-Funktionen arbeiten.

10
JaredPar

Sie können auch die Syntax für das Abfrageverständnis von LINQ verwenden, die in den Typ der Bereichsvariablen umgewandelt wird (in diesem Beispiel item), wenn ein Typ angegeben wird:

IEnumerable list = new ArrayList { "dog", "cat" };

IEnumerable<string> result =
  from string item in list
  select item;

foreach (string s in result)
{
    // InvalidCastException at runtime if element is not a string

    Console.WriteLine(s);
}

Der Effekt ist identisch mit der @ JaredPar-Lösung. Einzelheiten finden Sie unter 7.16.2.2: Explicit Range Variablentypen in der C # -Sprachenspezifikation.

3
TrueWill