2012-03-25 7 views
2

リストを並べ替えるコレクションの並べ替えを変更しますか?リストがありません<T>コレクションを変更しますか?

「System.InvalidOperationException:コレクションが変更されたため、列挙操作が実行されない可能性があります。他のスレッドでの例外。

私のマルチスレッドアプリケーションでは、すべてのスレッドはコレクションを読んでいると思っていましたが、1つのスレッドはソートを行います。

おかげ

+3

コレクションをソートすると個々の要素は変更されませんが、*コレクション*は明らかに変更されます。 –

+0

しかし、それは変更されたコレクション例外を引き起こしますか? – CodingHero

+0

この質問を見る - http://stackoverflow.com/questions/604831/collection-was-modified-enumeration-operation-may-not-execute –

答えて

6

はい、それはあなたが何を意味するかだ場合Sortは、インプレースであり、それは確かに任意のイテレータが無効になります。

コレクションのソートされた「ビュー」を表示する場合は、LINQのOrderBy演算子を使用できます。これは、既存のコレクションを変更せず、元のコレクションの要素を含むシーケンスを返します注文。何がそれを反復処理を開始する前に、もう一つの選択肢は、あなたが最初にリストを作成する際に一度だけ、それを並べ替えることである

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

:あなたが使用することができ

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

:代わりに例えばので

、 - の変更が必要です。ソート順が変更されない場合(リストに参照されているオブジェクトが変更されたなど)、一度やり直すだけです。

2

はい、List<T>.Sortメソッドは実際にコレクションを適切に並べ替え、コレクションを変更します。新しいコレクションを取得したい場合は、元のコレクションを変更しないでソートしてから、OrderBy拡張メソッドを使用してください。

List<int> theList = ...; 
theList.Sort(); // In place mutating sort. Has a void return 
List<int> sorted = theList 
    .OrderBy(Comparer<int>.Default) 
    .ToList(); 
関連する問題