2013-01-09 6 views
15

ich eine List<Person> haben und, anstatt sie für eine einfache Verarbeitung zu einem List<string> konvertieren möchten, die folgenden Schritte ausführen:Ist LINQ to Objects seine Ordnung zu halten

List<Person> persons = GetPersonsBySeatOrder(); 
List<string> seatNames = persons.Select(x => x.Name).ToList(); 

Console.WriteLine("First in line: {0}", seatNames[0]); 

Ist .Select() Anweisung in einer LINQ to Objects garantiert Objekt, um die Reihenfolge der Listenmitglieder nicht zu ändern? Angenommen, es wird keine explizite Unterteilung/Gruppierung/Reihenfolge hinzugefügt

Wenn eine beliebige .Where()-Klausel zuerst verwendet wird, ist es dann immer noch garantiert, die relative Reihenfolge beizubehalten, oder verwendet sie manchmal nicht-iteratives Filtern?


Wie Fermin oben kommentiert, ist dies im Wesentlichen eine doppelte Frage. Ich nicht gelungen, die richtigen Keywords auf die Auswahl Stackoverflow

Preserving order with LINQ

+5

Gute Details von linq Abfragen und Bestellung hier: http://StackOverflow.com/Questions/204505/reserving-order-with-linq – Fermin

Antwort

3

In aktuellen .NET-Implementierung suchen sie einen solchen Code verwenden. Aber es gibt keine Garantie, dass diese Umsetzung in Zukunft stattfinden wird.

private static IEnumerable<TResult> SelectIterator<TSource, TResult>(IEnumerable<TSource> source, Func<TSource, int, TResult> selector) 
{ 
    int index = -1; 
    foreach (TSource source1 in source) 
    { 
    checked { ++index; } 
    yield return selector(source1, index); 
    } 
} 
+2

Ich bezweifle, dass die interne Umsetzung einer so weit verbreiteten Methode wie .Select() würde geändert werden, um Objekte in einer anderen Reihenfolge zurückzugeben. – Fermin

+1

Datenbankzeilen haben keine garantierte Reihenfolge. Listen tun. Es sollte unbedingt vom zugrunde liegenden Sammlungs-Typ abhängen (d. H. Dem * Enumerator * des zugrunde liegenden Sammlungs-Typs), und die Reihenfolge der Liste sollte garantiert erhalten bleiben. Select würde den Enumerator des List-Typs verwenden, und derzeit wird die garantierte Reihenfolge beibehalten. – Triynko

2

Es hängt mehr als alles andere von der zugrundeliegenden Sammlungsart ab. Sie könnten eine inkonsistente Reihenfolge von einem HashSet erhalten, aber eine Liste ist sicher. Selbst wenn die gewünschte Reihenfolge implizit zur Verfügung gestellt wird, ist es besser, eine explizite Reihenfolge zu definieren, wenn Sie sie benötigen. Es sieht so aus, als würden Sie das anhand der Methodennamen beurteilen.