sintaxis - linq c# using
Cuándo usar Cast() y Oftype() en Linq (7)
Cast intentará lanzar todos los elementos al tipo T. Este lanzamiento podría fallar o lanzar una excepción. OfType devolverá un subconjunto de la colección original y devolverá solo objetos del tipo T.
IEnumerable
dos métodos de conversión de tipos a IEnumerable
desde un Arraylist
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?
Debería llamar a Cast<string>()
si sabe que todos los elementos son string
.
Si algunos de ellos no son cadenas, obtendrá una excepción.
Debería llamar a OfType<string>()
si sabe que algunos de los artículos no son string
y no desea esos artículos.
Si algunos de ellos no son cadenas, no estarán en la nueva IEnumerable<string>
.
OfType filtrará los elementos para devolver solo los del tipo especificado. Cast se bloqueará si un elemento no se puede convertir al tipo de destino.
Se debe tener en cuenta que Cast (Of T) se puede usar en IEnumerable a diferencia de otras funciones LINQ, por lo que si alguna vez necesitas usar LINQ en una colección o lista no genérica como ArrayList, puedes usar Cast ( De T) para convertir a un IEnumerable (Of T) donde LINQ puede funcionar.
http://solutionizing.net/2009/01/18/linq-tip-enumerable-oftype/
Fundamentalmente, Cast () se implementa así:
public IEnumerable<T> Cast<T>(this IEnumerable source)
{
foreach(object o in source)
yield return (T) o;
}
Usar una conversión explícita funciona bien, pero dará como resultado una InvalidCastException si falla la conversión. Una variación menos eficiente pero útil en esta idea es OfType ():
public IEnumerable<T> OfType<T>(this IEnumerable source)
{
foreach(object o in source)
if(o is T)
yield return (T) o;
}
La enumeración devuelta solo incluirá elementos que se pueden convertir de forma segura al tipo especificado.
Cast()
intentará emitir todos los elementos de la colección (y emitirá una excepción si el elemento es del tipo incorrecto), mientras que OfType()
devolverá solo los elementos del tipo apropiado.
OfType
- devuelve solo los elementos de tipo x.
Cast
: intentará convertir todos los elementos en tipo x. si algunos de ellos no son de este tipo, obtendrás InvalidCastException
EDITAR
por ejemplo:
object[] objs = new object[] { "12345", 12 };
objs.Cast<string>().ToArray(); //throws InvalidCastException
objs.OfType<string>().ToArray(); //return { "12345" }