nous savons tous la voie lente:Quel est un moyen rapide de convertir un IEnumerable <Foo> en Liste <Foo> en C# 2.0?
foreach..
nous savons tous la voie lente:Quel est un moyen rapide de convertir un IEnumerable <Foo> en Liste <Foo> en C# 2.0?
foreach..
Le List constructor is a good bet.
IEnumerable<T> enumerable = ...;
List<T> list = new List<T>(enumerable);
Que diriez-vous:
IEnumerable<T> sequence = GetSequenceFromSomewhere();
List<T> list = new List<T>(sequence);
Notez que ceci est optimisé pour la situation dans laquelle la séquence se trouve être un IList<T>
- il utilise ensuite IList<T>.CopyTo
. Il sera toujours O (n) dans la plupart des situations, mais potentiellement O (n) beaucoup plus rapide que l'itération :) (Il évite également tout redimensionnement comme il le crée.)
Ce constructeur copie les éléments énumérés dans la nouvelle liste, donc je doute que ce soit plus rapide (et cela ne pourrait pas non plus être le cas). Mais c'est certainement plus facile. – GraemeF
@GraemeF: Comme je l'ai noté, il * est * plus rapide si la séquence se trouve être un 'IList
Plus génériquement, ICollection
Vous souhaitez utiliser la méthode .AddRange sur une liste générique.
List<string> strings = new List<string>();
strings.AddRange(...);
.. ou le constructeur ..
new List<string>(...);
est 'foreach' vraiment trop lent pour vos besoins? – bcat
Je pense qu'un foreach se produira à tout moment, il n'y a pas de magie. – jonaspp