Comment puis-je convertir un List<MyObject>
en un IEnumerable<MyObject>
puis inversement?
Je veux faire cela pour exécuter une série d'instructions LINQ sur la liste, par exemple Sort()
c#
linq
list
ienumerable
TK.
la source
la source
Réponses:
la source
using System.Linq;
ou vous ne pourrez pas ToList ()A
List<T>
est unIEnumerable<T>
, donc en fait, il n'est pas nécessaire de «convertir» unList<T>
en unIEnumerable<T>
. Puisque aList<T>
est unIEnumerable<T>
, vous pouvez simplement affecter aList<T>
à une variable de typeIEnumerable<T>
.À l'inverse, tout
IEnumerable<T>
n'est pas unList<T>
offcourse, vous devrez donc appeler laToList()
méthode membre duIEnumerable<T>
.la source
A
List<T>
est déjà unIEnumerable<T>
, vous pouvez donc exécuter des instructions LINQ directement sur votreList<T>
variable.Si vous ne voyez pas les méthodes d'extension LINQ comme
OrderBy()
je suppose, c'est parce que vous n'avez pas deusing System.Linq
directive dans votre fichier source.Vous devez cependant reconvertir le résultat de l'expression LINQ en un résultat
List<T>
explicite:la source
À part: Notez que les opérateurs LINQ standard (comme dans l'exemple précédent) ne modifient pas la liste existante -
list.OrderBy(...).ToList()
créeront une nouvelle liste basée sur la séquence réorganisée. Cependant, il est assez facile de créer une méthode d'extension qui vous permet d'utiliser des lambdas avecList<T>.Sort
:Ensuite, vous pouvez utiliser:
Cela met à jour la liste existante de la même manière que d'
List<T>.Sort
habitude.la source
ToList
- Je clarifierai cependant.Conversion
List<T>
enIEnumerable<T>
List<T>
implémenteIEnumerable<T>
(et beaucoup d'autres tels queIList<T>, ICollection<T>
), il n'est donc pas nécessaire de reconvertir une liste en IEnumerable car elle est déjàIEnumerable<T>
.Exemple:
Vous pouvez également utiliser la
Enumerable.AsEnumerable()
méthodeConversion
IEnumerable<T>
enList<T>
Ceci est utile dans Entity Framework .
la source
Pour éviter la duplication en mémoire, resharper suggère ceci:
.ToList () renvoie une nouvelle liste immuable. Ainsi, les modifications apportées à listAgain n'affectent pas maListe dans la réponse @Tamas Czinege. Ceci est correct dans la plupart des cas pour au moins deux raisons: cela permet d'éviter que des changements dans une zone affectent l'autre zone (couplage lâche), et c'est très lisible, car nous ne devrions pas concevoir de code avec des préoccupations de compilateur.
Mais il y a certains cas, comme être dans une boucle serrée ou travailler sur un système embarqué ou à faible mémoire, où les considérations du compilateur doivent être prises en compte.
la source