238 votes

Quand utiliser Cast() et Oftype() en Linq ?

Je connais deux méthodes pour convertir les types en IEnumerable d'un Arraylist en Linq et vous vous demandez dans quels cas les utiliser ?

Par exemple

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

o

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

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

365voto

Itay Karo Points 10446

OfType - retourne uniquement les éléments de type x.
Cast - va essayer de mettre tous les éléments dans le type x. Si certains d'entre eux ne sont pas de ce type, vous obtiendrez InvalidCastException

EDITAR
par exemple :

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

122voto

Ash Points 678

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

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

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

L'utilisation d'un cast explicite donne de bons résultats, mais entraîne une InvalidCastException si le cast échoue. Une variation 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 ne comprendra que les éléments qui peuvent être convertis en toute sécurité au type spécifié.

45voto

SLaks Points 391154

Vous devez appeler Cast<string>() si vous savez que tous les articles sont string s.
Si certaines d'entre elles ne sont pas des chaînes de caractères, vous obtiendrez une exception.

Vous devez appeler OfType<string>() si vous savez que certains éléments ne sont pas string et vous ne voulez pas de ces articles.
Si certaines d'entre elles ne sont pas des cordes, elles ne seront pas dans le nouveau IEnumerable<string> .

7voto

Niya Points 11

Il faut noter que Cast(Of T) peut être utilisé sur IEnumerable contrairement aux autres fonctions LINQ, donc si jamais vous avez besoin d'utiliser LINQ sur une collection ou une liste non générique telle qu'une ArrayList, vous pouvez utiliser Cast(Of T) pour faire un cast vers un IEnumerable(Of T) où LINQ peut fonctionner.

2voto

Andrew Bezzub Points 8794

Cast() essaiera d'intégrer tous les éléments de la collection (et lèvera une exception si l'élément n'est pas du bon type) alors que OfType() ne retournera que les éléments de type approprié.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X