Cuándo usar Cast () y Oftype () en Linq

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 someCollection = arrayList.OfType() 

o

 IEnumerable someCollection = arrayList.Cast() 

¿Cuál es la diferencia entre estos dos métodos y dónde debo aplicar cada caso?

OfType : devuelve solo los elementos que se pueden convertir de forma segura para escribir 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().ToArray(); //throws InvalidCastException objs.OfType().ToArray(); //return { "12345" } 

http://solutionizing.net/2009/01/18/linq-tip-enumerable-oftype/

Fundamentalmente, Cast () se implementa así:

 public IEnumerable Cast(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 OfType(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.

Debería llamar a Cast() si sabe que todos los elementos son string .
Si algunos de ellos no son cadenas, obtendrá una excepción.

Debería llamar a OfType() 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 .

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.

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 filtrará los elementos para devolver solo los del tipo especificado. Cast se bloqueará si un elemento no se puede convertir al tipo de destino.

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.