J'ai une liste:
List<int> list = new List<int> { 1, 2, 3, 4, 5 };
Je souhaite appliquer une transformation aux éléments de ma liste. Je peux le faire de deux manières:
List<int> list1 = list.Select(x => 2 * x).ToList();
List<int> list2 = list.ConvertAll(x => 2 * x).ToList();
Quelle est la différence entre ces deux méthodes?
Réponses:
Select
est une méthode d'extension LINQ et fonctionne sur tous lesIEnumerable<T>
objets alors qu'elleConvertAll
n'est implémentée que parList<T>
. LaConvertAll
méthode existe depuis .NET 2.0 alors que LINQ a été introduit avec 3.5.Vous devriez privilégier
Select
plusConvertAll
que cela fonctionne pour tout type de liste, mais ils faire la même chose au fond.la source
Select
etConvertAll
. Le premier sélectionne chaque élément dans une séquence et vous êtes libre d'en faire ce que vous voulez. Ce dernier a une intention claire: convertir cet objet en autre chose.ConvertAll
n'est pas une extension, c'est une méthode de la classe list. Vous n'êtes pas obligé d'appelerToList
le résultat car c'est déjà une liste:Donc, la différence est que la
ConvertAll
méthode ne peut être utilisée que sur une liste et qu'elle renvoie une liste. LaSelect
méthode peut être utilisée sur n'importe quelle collection qui implémente l'IEnumerable<T>
interface et elle renvoie unIEnumerable<T>
.En outre, ils effectuent le traitement différemment, de sorte qu'ils ont leurs forces dans différentes situations. La
ConvertAll
méthode parcourt la liste et crée une nouvelle liste en une seule fois, tandis que laSelect
méthode utilise une exécution différée et ne traite que les éléments dont vous avez besoin. Si vous n'avez pas besoin de tous les éléments, laSelect
méthode est plus efficace. Par contre, une foisConvertAll
la liste renvoyée, vous n'avez pas besoin de conserver la liste d'origine.la source
Select
.La première réponse ne doit pas être celle acceptée. Je suis un ancien MVP C # Microsoft 2007.
Contrairement à la réponse acceptée,
ConvertAll
est beaucoup plus efficace que la combinaison deSelect
etToList()
.Tout d'abord,
ConvertAll
est strictement plus rapide et utilise le minimum de mémoire pour ce faire. Identique à Array.ConvertAll vs Select et ToArray. Ce serait beaucoup plus évident avec un tableau de plus grande longueur ou de nombreux appels dans une boucle.1)
ConvertAll
connaît la taille de la liste finale et évite de réallouer le tableau de base.ToList
() continuera à redimensionner le tableau plusieurs fois.2)
ToList
fera desIEnumerable<>
appels d' interface plus lents , tandis queConvertAll
bouclera à travers le tableau sous-jacent sans appels supplémentaires ni vérification de plage.3) Select créera un
IEnumerable<T>
objet supplémentaire .la source
Je sais que c'est un peu tard mais j'ai quand même ajouté car cela pourrait être d'une certaine utilité pour d'autres à l'avenir.
Lorsque vous l'utilisez dans une expression de requête EntityFramework, il n'est pas recommandé d'utiliser ConvertAll () car il évalue l'expression plutôt que de la laisser comme expression pour une utilisation future. Cela dégrade gravement les performances d'exécution des requêtes de base de données car il faudrait effectuer un certain nombre d'appels avant d'évaluer l'expression finale.
la source
ConvertAll
est une méthode surList<T>
. Au moment où vous avez la liste, vous avez déjà évalué votre expression. Mais vous avez raison - si vous ne voulez pas tout évaluer,Select
c'est préférable.