Ich kenne zwei Methoden, um Typen IEnumerable
von einem Arraylist
in Linq zu gießen und mich zu fragen, in welchen Fällen ich sie verwenden soll.
z.B
IEnumerable<string> someCollection = arrayList.OfType<string>()
oder
IEnumerable<string> someCollection = arrayList.Cast<string>()
Was ist der Unterschied zwischen diesen beiden Methoden und wo soll ich jeden Fall anwenden?
Cast<T>
wenn Sie sicher sind, dass die Auflistung nur Typelemente enthältT
.OfType<T>
ist aufgrund deris
Typprüfung langsamer . Wenn die Sammlung vom Typ istIEnumerable<T>
,Cast<T>
wird einfach die gesamte Sammlung als gegossen,IEnumerable<T>
und es wird vermieden, sie aufzuzählen.OfType<T>
wird noch aufzählen. ref: stackoverflow.com/questions/11430570/….Cast<string>()
nicht geworfen wird, wenn es aufgezählt wird, ist es nicht gleichbedeutend mit.OfType<string>()
. Der Grund ist, dassnull
Werte immer übersprungen werden.OfType<TResult>()
. Ein Beispiel:new System.Collections.ArrayList { "abc", "def", null, "ghi", }.OfType<string>().Count()
wird nur geben3
; der ähnliche Ausdruck mit.Cast<string>()
ergibt4
.http://solutionizing.net/2009/01/18/linq-tip-enumerable-oftype/
Grundsätzlich ist Cast () folgendermaßen implementiert:
Die Verwendung einer expliziten Umwandlung funktioniert gut, führt jedoch zu einer InvalidCastException, wenn die Umwandlung fehlschlägt. Eine weniger effiziente und dennoch nützliche Variante dieser Idee ist OfType ():
Die zurückgegebene Aufzählung enthält nur Elemente, die sicher in den angegebenen Typ umgewandelt werden können.
quelle
Sie sollten anrufen,
Cast<string>()
wenn Sie wissen, dass alle Elementestring
s sind.Wenn einige von ihnen keine Zeichenfolgen sind, erhalten Sie eine Ausnahme.
Sie sollten anrufen,
OfType<string>()
wenn Sie wissen, dass einige der Elemente nichtstring
s sind und Sie diese Elemente nicht möchten.Wenn einige von ihnen keine Zeichenfolgen sind, werden sie nicht in der neuen sein
IEnumerable<string>
.quelle
Es sollte beachtet werden, dass
Cast(Of T)
dies imIEnumerable
Gegensatz zu anderen LINQ-Funktionen verwendet werden kann. Wenn Sie also jemals LINQ für eine nicht generische Sammlung oder Liste wie eine verwenden müssenArrayList
, können Sie dieseCast(Of T)
in eine FunktionIEnumerable(Of T)
umwandeln, in der LINQ funktionieren kann.quelle
Cast()
wird versuchen, alle Elemente der Sammlung zu konvertieren (und eine Ausnahme auslösen, wenn das Element vom falschen Typ ist), währendOfType()
nur Elemente vom richtigen Typ zurückgegeben werden.quelle
OfType
filtert die Elemente so, dass nur diejenigen des angegebenen Typs zurückgegeben werden.Cast
stürzt ab, wenn ein Element nicht in den Zieltyp umgewandelt werden kann.quelle
Cast<T>
wird versuchen, alle Gegenstände auf den angegebenen Typ zu übertragenT
. Diese Besetzung könnte fehlschlagen oder eine Ausnahme auslösen.OfType<T>
gibt eine Teilmenge der ursprünglichen Sammlung zurück und gibt nur Objekte vom Typ zurückT
.quelle