Jestem świadomy dwóch metod rzutowania typów IEnumerable
zArraylist
Linq i zastanawiam się, w jakich przypadkach ich użyć?
na przykład
IEnumerable<string> someCollection = arrayList.OfType<string>()
lub
IEnumerable<string> someCollection = arrayList.Cast<string>()
Jaka jest różnica między tymi dwiema metodami i gdzie powinienem zastosować każdy przypadek?
Cast<T>
gdy wiesz na pewno, że kolekcja zawiera tylkoT
elementy typu .OfType<T>
jest wolniejszy ze względu nais
kontrolę typu. Jeśli kolekcja jest typuIEnumerable<T>
,Cast<T>
po prostu rzuci całą kolekcję jakoIEnumerable<T>
i uniknie jej wyliczenia;OfType<T>
będzie nadal wyliczać. ref: stackoverflow.com/questions/11430570/….Cast<string>()
gdy nie rzuca się po wyliczeniu, nie jest równoważne z.OfType<string>()
. Powodem jest to, żenull
wartości są zawsze pomijane.OfType<TResult>()
. Przykład:new System.Collections.ArrayList { "abc", "def", null, "ghi", }.OfType<string>().Count()
da tylko3
; podobne wyrażenie z.Cast<string>()
ocenia na4
.http://solutionizing.net/2009/01/18/linq-tip-enumerable-oftype/
Zasadniczo Cast () jest implementowany w następujący sposób:
Użycie jawnego rzutowania działa dobrze, ale spowoduje niepowodzenie InvalidCastException. Mniej wydajną, ale przydatną odmianą tego pomysłu jest OfType ():
Zwrócone wyliczenie będzie zawierało tylko elementy, które można bezpiecznie rzutować na określony typ.
źródło
Powinieneś zadzwonić,
Cast<string>()
jeśli wiesz, że wszystkie elementy sąstring
s.Jeśli niektóre z nich nie są łańcuchami, otrzymasz wyjątek.
Powinieneś zadzwonić,
OfType<string>()
jeśli wiesz, że niektóre elementy nie sąstring
i nie chcesz tych przedmiotów.Jeśli niektóre z nich nie są łańcuchami, nie będą w nowym
IEnumerable<string>
.źródło
Należy zauważyć, że
Cast(Of T)
można go używać wIEnumerable
odróżnieniu od innych funkcji LINQ, więc jeśli kiedykolwiek zajdzie potrzeba użycia LINQ w nieogólnej kolekcji lub liście, takiej jak anArrayList
, możesz użyćCast(Of T)
do rzutowania do miejsca, wIEnumerable(Of T)
którym LINQ może działać.źródło
Cast()
spróbuje rzucić wszystkie elementy kolekcji (i wyrzuci wyjątek, jeśli element jest niewłaściwego typu), aOfType()
zwróci tylko elementy właściwego typu.źródło
OfType
przefiltruje elementy, aby zwrócić tylko te określonego typu.Cast
zawiesza się, jeśli elementu nie można rzutować na typ docelowy.źródło
Cast<T>
spróbuje rzucić wszystkie przedmioty na dany typT
. Ta obsada może zakończyć się niepowodzeniem lub zgłosić wyjątek.OfType<T>
zwróci podzbiór oryginalnej kolekcji i zwróci tylko obiekty typuT
.źródło