106 votes

C# convertir Librement entre la Liste<T> et IEnumerable<T>

Comment puis-je convertir un List<MyObject> d'un IEnumerable<MyObject> , puis de nouveau?

Je veux faire cela dans le but d'exécuter une série de LINQ déclarations sur la Liste, l'e. g. Sort()

148voto

Tamas Czinege Points 49277
List<string> myList = new List<string>();
IEnumerable<string> myEnumerable = myList;
List<string> listAgain = myEnumerable.ToList();

21voto

Frederik Gheysels Points 36354

Un List<T> est IEnumerable<T>, donc en fait, il n'y a pas besoin de "convertir" un List<T> d'un IEnumerable<T>. Depuis un List<T> est IEnumerable<T>, vous pouvez tout simplement créer un List<T> pour une variable de type IEnumerable<T>.

À l'inverse, ne sont pas tous IEnumerable<T> est List<T> offcourse, alors vous aurez à appeler l' ToList() méthode de membre de l' IEnumerable<T>.

9voto

Dan Berindei Points 2326

Un List<T> est déjà un IEnumerable<T>, de sorte que vous pouvez exécuter LINQ états directement sur votre List<T> variable.

Si vous ne voyez pas l'extension LINQ méthodes comme OrderBy() je suppose que c'est parce que vous ne disposez pas d'un using System.Linq directive dans votre fichier source.

Vous avez besoin de convertir l'expression LINQ résultat en List<T> explicitement, si:

List<Customer> list = ...
list = list.OrderBy(customer => customer.Name).ToList()

5voto

Marc Gravell Points 482669

De côté: à Noter que la norme des opérateurs LINQ (comme pour l'exemple précédent) ne pas modifier l' existant de la liste - list.OrderBy(...).ToList() permettra de créer une nouvelle liste en fonction de l'ordre. Il est assez facile, cependant, de créer une méthode d'extension qui vous permet d'utiliser les lambdas avec List<T>.Sort:

static void Sort<TSource, TValue>(this List<TSource> list,
    Func<TSource, TValue> selector)
{
    var comparer = Comparer<TValue>.Default;
    list.Sort((x,y) => comparer.Compare(selector(x), selector(y)));
}

static void SortDescending<TSource, TValue>(this List<TSource> list,
    Func<TSource, TValue> selector)
{
    var comparer = Comparer<TValue>.Default;
    list.Sort((x,y) => comparer.Compare(selector(y), selector(x)));
}

Ensuite, vous pouvez utiliser:

list.Sort(x=>x.SomeProp); // etc

Cette mise à jour de l' existant de la liste de la même manière qu' List<T>.Sort le fait habituellement.

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