2012-03-25 14 views
2

funktioniert die Liste Sortieren die Sammlung?Ist die Liste <T> Sortieren ändern die Sammlung?

Ich denke, es muss, wie ich bekomme eine "System.InvalidOperationException: Sammlung wurde geändert; Aufzählung Operation möglicherweise nicht ausgeführt." Ausnahme in einem anderen Thread.

In meiner Multithread-App haben alle Threads, die ich dachte, nur die Sammlung gelesen, aber ein Thread macht eine Sortierung.

Dank

+3

Das Sortieren einer Sammlung sollte nicht die einzelnen Elemente ändern, aber es wird offensichtlich die * Sammlung * ändern. –

+0

Aber wird es eine modifizierte Sammlungsausnahme verursachen? – CodingHero

+0

Blick auf diese Frage - http://StackOverflow.com/Questions/604831/Collection-was-modified-Enumeration-Operation-May-not-execute –

Antwort

6

Ja, Sort ist an Ort und Stelle, wenn es das ist, was Sie meinen, und es wird sicherlich keine Iteratoren ungültig machen.

Wenn Sie eine sortierte „Ansicht“ der Sammlung sehen möchten, können Sie OrderBy Operator LINQ verwenden, die nicht die bestehende Sammlung nicht verändert, sondern gibt eine Sequenz, die die Elemente aus der ursprünglichen Sammlung enthält, aber in der gegebenen Auftrag.

So zum Beispiel, statt:

// I want to print out the list of names, sorted... 
names.Sort(); 
foreach (string name in names) 
{ 
    Console.WriteLine(name); 
} 

könnten Sie verwenden:

foreach (string name in names.OrderBy(x => x)) 
{ 
    Console.WriteLine(name); 
} 

Eine weitere Alternative ist es gerade einmal zu sortieren, wenn Sie zuerst die Liste füllen, bevor irgendetwas über sie beginnt Iterieren - das ist die nur Änderung erforderlich, und wenn die Sortierreihenfolge nicht geändert wird (z. B. aufgrund von Änderungen an den Objekten in der Liste verwiesen), dann wäre es sinnvoll, nur einmal zu tun.

2

Ja, die List<T>.Sort Methode sortiert die Sammlung tatsächlich und ersetzt die Sammlung. Wenn Sie stattdessen eine neue Sammlung erhalten möchten, die nicht das Original ändert, verwenden Sie die Erweiterungsmethode OrderBy.

List<int> theList = ...; 
theList.Sort(); // In place mutating sort. Has a void return 
List<int> sorted = theList 
    .OrderBy(Comparer<int>.Default) 
    .ToList(); 
Verwandte Themen