Je connais deux méthodes pour lancer des types vers IEnumerable
unArraylist
dans 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?
Cast<T>
lorsque vous savez avec certitude que la collection ne contient que desT
éléments de type .OfType<T>
est plus lent en raison de lais
vérification du type. Si la collection est de typeIEnumerable<T>
,Cast<T>
elle transtypera simplement la collection entière en tant queIEnumerable<T>
et évitera de l'énumérer;OfType<T>
sera encore énumérer. ref: stackoverflow.com/questions/11430570/….Cast<string>()
ne lance pas quand il est énuméré, ce n'est pas équivalent à.OfType<string>()
. La raison en est que lesnull
valeurs sont toujours ignorées.OfType<TResult>()
. Un exemple:new System.Collections.ArrayList { "abc", "def", null, "ghi", }.OfType<string>().Count()
ne donnera que3
; l'expression similaire à.Cast<string>()
évalue à4
.http://solutionizing.net/2009/01/18/linq-tip-enumerable-oftype/
Fondamentalement, Cast () est implémenté comme ceci:
L'utilisation d'un cast explicite fonctionne bien, mais entraînera une InvalidCastException si le cast échoue. OfType () est une variante moins efficace mais utile de cette idée:
L'énumération retournée inclura uniquement les éléments qui peuvent être convertis en toute sécurité dans le type spécifié.
la source
Vous devriez appeler
Cast<string>()
si vous savez que tous les articles sont desstring
art.Si certains d'entre eux ne sont pas des chaînes, vous obtiendrez une exception.
Vous devriez appeler
OfType<string>()
si vous savez que certains éléments ne sont passtring
s et que vous ne voulez pas ces éléments.Si certains d'entre eux ne sont pas des chaînes, ils ne seront pas dans le nouveau
IEnumerable<string>
.la source
Il convient de noter que
Cast(Of T)
peut être utilisé surIEnumerable
contrairement à d'autres fonctions LINQ, donc s'il y a un cas où vous devez utiliser LINQ sur une collection ou une liste non générique comme unArrayList
, vous pouvez utiliserCast(Of T)
pour effectuer un cast vers unIEnumerable(Of T)
endroit où LINQ peut fonctionner.la source
Cast()
essaiera de transtyper tous les éléments de la collection (et lèvera une exception si l'élément est du mauvais type) tandis queOfType()
ne retournera que les éléments de type approprié.la source
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 en type cible.la source
Cast<T>
va essayer de lancer tous les éléments dans le type donnéT
. Cette conversion peut échouer ou lever une exception.OfType<T>
renverra un sous-ensemble de la collection d'origine et renverra uniquement les objets de typeT
.la source