Я знаю двух способов литья типов в IEnumerable
С Arraylist
в Linq и интересно , в каких случаях использовать их?
например
IEnumerable<string> someCollection = arrayList.OfType<string>()
или
IEnumerable<string> someCollection = arrayList.Cast<string>()
В чем разница между этими двумя методами и где я должен применять каждый случай?
Cast<T>
когда точно знаете, что коллекция содержит толькоT
элементы типа .OfType<T>
медленнее из-заis
проверки типа. Если коллекция относится к типуIEnumerable<T>
,Cast<T>
просто приведёт всю коллекцию какIEnumerable<T>
и избежать ее перечисления;OfType<T>
все равно будет перечислять. ссылка: stackoverflow.com/questions/11430570/….Cast<string>()
не выбрасывает при перечислении, это не эквивалентно.OfType<string>()
. Причина в том, чтоnull
значения всегда пропускаются.OfType<TResult>()
. Пример:new System.Collections.ArrayList { "abc", "def", null, "ghi", }.OfType<string>().Count()
даст только3
; аналогичное выражение с.Cast<string>()
вычисляет до4
.http://solutionizing.net/2009/01/18/linq-tip-enumerable-oftype/
По сути, Cast () реализован так:
Использование явного приведения хорошо работает, но приведет к исключению InvalidCastException в случае сбоя приведения. Менее эффективный, но полезный вариант этой идеи - OfType ():
Возвращенное перечисление будет включать только элементы, которые можно безопасно привести к указанному типу.
источник
Вам следует позвонить,
Cast<string>()
если вы знаете, что все предметыstring
s.Если некоторые из них не являются строками, вы получите исключение.
Вам следует позвонить,
OfType<string>()
если вы знаете, что некоторые предметы не принадлежатstring
вам, и вам не нужны эти предметы.Если некоторые из них не являются строками, они не будут в новом
IEnumerable<string>
.источник
Следует отметить, что
Cast(Of T)
его можно использовать вIEnumerable
отличие от других функций LINQ, поэтому, если когда-либо понадобится использовать LINQ для неуниверсальной коллекции или списка, такого какArrayList
, вы можете использоватьCast(Of T)
для приведения к томуIEnumerable(Of T)
месту, где может работать LINQ.источник
Cast()
попытается привести все элементы коллекции (и выдаст исключение, если элемент имеет неправильный тип), в то время какOfType()
вернет только элементы правильного типа.источник
OfType
отфильтрует элементы, чтобы вернуть только элементы указанного типа.Cast
потерпит крах, если элемент не может быть приведен к целевому типу.источник
Cast<T>
постараюсь привести все предметы к данному типуT
. Это приведение может завершиться неудачей или вызвать исключение.OfType<T>
вернет подмножество исходной коллекции и вернет только объекты, имеющие типT
.источник