Cuándo usar Cast () y Oftype () en Linq
Soy consciente de dos métodos de tipos de fundición a IEnumerable
de un Arraylist
en Linq y me pregunto en qué casos usarlos?
E. g
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?
7 answers
OfType
- devuelve solo los elementos que se pueden convertir de forma segura a tipo x.Cast
- intentará convertir todos los elementos en tipo x. si algunos de ellos no son de este tipo obtendrá InvalidCastException
EDITAR
por ejemplo:
object[] objs = new object[] { "12345", 12 };
objs.Cast<string>().ToArray(); //throws InvalidCastException
objs.OfType<string>().ToArray(); //return { "12345" }
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-22 21:52:03
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 un cast explícito funciona bien, pero resultará en una InvalidCastException si el cast falla. Una variación menos eficiente pero útil de 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.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-25 15:13:59
Debes llamar a Cast<string>()
si sabes que todos los elementos son string
s.
Si algunos de ellos no son cadenas, obtendrás una excepción.
Debes llamar a OfType<string>()
si sabes que algunos de los elementos no son string
s y no quieres esos elementos.
Si algunos de ellos no son cadenas, no estarán en el nuevo IEnumerable<string>
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-25 15:14:34
Debe tenerse en cuenta que Cast(De T) se puede usar en Arraumerable a diferencia de otras funciones de LINQ, por lo que si alguna vez hay un caso en el que necesita usar LINQ en una colección o lista no genérica como una ArrayList, puede usar Cast(De T) para convertir a unEnumerable(De T) donde LINQ puede funcionar.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-30 09:21:01
Cast()
intentará lanzar todos los elementos de la colección (y lanzará una excepción si el elemento es del tipo incorrecto) mientras que OfType()
devolverá solo los elementos del tipo correcto.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-25 15:13:31
OfType filtrará los elementos para devolver solo los del tipo especificado. Cast se bloqueará si un elemento no puede ser lanzado al tipo de destino.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-25 15:14:13
Cast intentará lanzar todos los elementos al tipo T dado.Este cast podría fallar o lanzar una excepción. OfType devolverá un subconjunto de la colección original y devolverá solo objetos que sean de tipo T.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-25 15:15:01