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?
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" }
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é.
Vous devriez appeler Cast<string>()
si vous savez que tous les éléments sont string
s.
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 string
s 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>
.
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.
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.
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.
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
.