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?

 168
Author: George Stocker, 2010-10-25

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" }
 265
Author: Itay Karo,
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.

 90
Author: Ash,
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>.

 27
Author: SLaks,
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.

 3
Author: Niya,
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.

 2
Author: Andrew Bezzub,
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.

 2
Author: Johann Blais,
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.

 2
Author: Brian Ensink,
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