web-dev-qa-db-fra.com

Quand utiliser Cast () et Oftype () dans Linq

Je connais deux méthodes de transtypage de types à IEnumerable à partir de Arraylist à Linq et je me demande dans quels cas les utiliser?

par exemple

IEnumerable<string> someCollection = arrayList.OfType<string>()

ou

IEnumerable<string> someCollection = arrayList.Cast<string>()

Quelle est la différence entre ces deux méthodes et où dois-je appliquer chaque cas?

196
user486523

OfType - ne renvoie que les éléments pouvant être transtypés en toute sécurité vers le type x.
Cast - essayera de convertir tous les éléments en type x. si certains ne sont pas de ce type, vous aurez InvalidCastException

EDIT
par exemple:

object[] objs = new object[] { "12345", 12 };
objs.Cast<string>().ToArray(); //throws InvalidCastException
objs.OfType<string>().ToArray(); //return { "12345" }
301
Itay Karo

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

Fondamentalement, Cast () est implémenté comme ceci:

public IEnumerable<T> Cast<T>(this IEnumerable source)
{
  foreach(object o in source)
    yield return (T) o;
}

L'utilisation d'une distribution explicite donne de bons résultats, mais entraîne une exception InvalidCastException si la distribution échoue. Une variante moins efficace mais utile de cette idée est OfType ():

public IEnumerable<T> OfType<T>(this IEnumerable source)
{
  foreach(object o in source)
    if(o is T)
      yield return (T) o;
}

L'énumération renvoyée n'inclura que les éléments pouvant être transtypés en toute sécurité vers le type spécifié.

102
Ash

Vous devriez appeler Cast<string>() si vous savez que tous les éléments sont strings.
Si certains ne sont pas des chaînes, vous obtiendrez une exception.

Vous devriez appeler OfType<string>() si vous savez que certains éléments ne sont pas strings et que vous ne souhaitez pas utiliser ces éléments.
Si certains ne sont pas des chaînes, ils ne seront pas dans le nouveau IEnumerable<string>.

33
SLaks

Il est à noter que Cast(Of T) peut être utilisé sur IEnumerable contrairement aux autres fonctions LINQ. Par conséquent, si jamais vous devez utiliser LINQ sur une collection ou une liste non générique telle qu'une ArrayList, vous pouvez utiliser Cast(Of T) pour transtyper en IEnumerable(Of T) où LINQ peut fonctionner.

4
Niya

Cast() essaiera de convertir tous les éléments de la collection (et lèvera une exception si l'élément est de type incorrect) alors que OfType() ne renverra que des éléments de type correct.

2
Andrew Bezzub

OfType filtrera les éléments pour ne renvoyer que ceux du type spécifié. Cast plantera si un élément ne peut pas être converti dans le type cible.

2
Johann Blais

Cast<T> tentera de convertir tous les éléments dans le type donné T. Cette distribution pourrait échouer ou renvoyer une exception. OfType<T> renverra un sous-ensemble de la collection d'origine et renverra uniquement les objets de type T.

2
Brian Ensink