Conozco dos métodos de conversión de tipos IEnumerable
desdeArraylist
en Linq y me pregunto en qué casos usarlos.
p.ej
IEnumerable<string> someCollection = arrayList.OfType<string>()
o
IEnumerable<string> someCollection = arrayList.Cast<string>()
¿Cuál es la diferencia entre estos dos métodos y dónde debo aplicar cada caso?
Cast<T>
cuando sabe con certeza que la colección contiene soloT
elementos de tipo .OfType<T>
es más lento debido a lais
verificación de tipo. Si la colección es de tipoIEnumerable<T>
,Cast<T>
simplemente emitirá toda la colección comoIEnumerable<T>
y evitará enumerarla;OfType<T>
seguirá enumerando. ref: stackoverflow.com/questions/11430570/….Cast<string>()
que no se lanza cuando se enumera, no es equivalente a.OfType<string>()
. La razón es que losnull
valores siempre se omiten.OfType<TResult>()
. Un ejemplo:new System.Collections.ArrayList { "abc", "def", null, "ghi", }.OfType<string>().Count()
solo dará3
; la expresión similar con.Cast<string>()
evalúa a4
.http://solutionizing.net/2009/01/18/linq-tip-enumerable-oftype/
Fundamentalmente, Cast () se implementa así:
El uso de una conversión explícita funciona bien, pero dará como resultado una InvalidCastException si la conversión falla. Una variación menos eficiente pero útil de esta idea es OfType ():
La enumeración devuelta solo incluirá elementos que se puedan convertir de forma segura en el tipo especificado.
fuente
Debe llamar
Cast<string>()
si sabe que todos los artículos sonstring
s.Si algunos de ellos no son cadenas, obtendrá una excepción.
Debe llamar
OfType<string>()
si sabe que algunos de los artículos no sonstring
sy no desea esos artículos.Si algunos de ellos no son cadenas, no estarán en el nuevo
IEnumerable<string>
.fuente
Cabe señalar que
Cast(Of T)
se puede usar aIEnumerable
diferencia de otras funciones de LINQ, por lo que si alguna vez necesita usar LINQ en una colección o lista no genérica comoArrayList
, puede usarloCast(Of T)
para convertirlo en un lugarIEnumerable(Of T)
donde LINQ pueda funcionar.fuente
Cast()
intentará lanzar todos los elementos de la colección (y lanzará una excepción si el elemento es del tipo incorrecto) mientrasOfType()
que solo devolverá elementos del tipo adecuado.fuente
OfType
filtrará los elementos para devolver solo los del tipo especificado.Cast
se bloqueará si un elemento no se puede lanzar al tipo de destino.fuente
Cast<T>
intentará lanzar todos los elementos al tipo dadoT
. Este elenco podría fallar o arrojar una excepción.OfType<T>
devolverá un subconjunto de la colección original y solo devolverá objetos de tipoT
.fuente