Estou ciente de dois métodos de conversão de tipos para IEnumerable
um Arraylist
no Linq e me pergunto em quais casos usá-los?
por exemplo
IEnumerable<string> someCollection = arrayList.OfType<string>()
ou
IEnumerable<string> someCollection = arrayList.Cast<string>()
Qual é a diferença entre esses dois métodos e onde devo aplicar cada caso?
Cast<T>
quando tiver certeza de que a coleção contém apenasT
elementos de tipo .OfType<T>
é mais lento devido àis
verificação de tipo. Se a coleção for do tipoIEnumerable<T>
,Cast<T>
simplesmente converterá a coleção inteira comoIEnumerable<T>
e evitar enumerá-la;OfType<T>
ainda enumerará. ref: stackoverflow.com/questions/11430570/….Cast<string>()
não é lançado quando é enumerado, não é equivalente a.OfType<string>()
. O motivo é que osnull
valores são sempre ignorados.OfType<TResult>()
. Um exemplo:new System.Collections.ArrayList { "abc", "def", null, "ghi", }.OfType<string>().Count()
dará apenas3
; a expressão semelhante com.Cast<string>()
avalia para4
.http://solutionizing.net/2009/01/18/linq-tip-enumerable-oftype/
Fundamentalmente, Cast () é implementado assim:
O uso de uma conversão explícita tem um bom desempenho, mas resultará em InvalidCastException se a conversão falhar. Uma variação menos eficiente e útil dessa ideia é OfType ():
A enumeração retornada incluirá apenas elementos que podem ser convertidos com segurança para o tipo especificado.
fonte
Você deve ligar
Cast<string>()
se souber que todos os itens sãostring
s.Se alguns deles não forem strings, você receberá uma exceção.
Você deve ligar
OfType<string>()
se souber que alguns dos itens não são sestring
você não os deseja.Se alguns deles não são strings, eles não estarão no novo
IEnumerable<string>
.fonte
Deve-se notar que
Cast(Of T)
pode ser usadoIEnumerable
diferentemente de outras funções do LINQ, portanto, se houver um caso em que você precise usar o LINQ em uma coleção ou lista não genérica como umaArrayList
, você poderá usarCast(Of T)
para transmitir para umIEnumerable(Of T)
local em que o LINQ possa funcionar.fonte
Cast()
tentará converter todos os elementos da coleção (e lançará uma exceção se o elemento for do tipo errado) enquantoOfType()
retornará apenas elementos do tipo apropriado.fonte
OfType
filtrará os elementos para retornar apenas os do tipo especificado.Cast
falhará se um elemento não puder ser convertido para o tipo de destino.fonte
Cast<T>
tentará converter todos os itens para o tipo especificadoT
. Esse elenco pode falhar ou gerar uma exceção.OfType<T>
irá retornar um subconjunto da coleção original e retornar apenas objetos que são do tipoT
.fonte