2012-03-25 42 views
2

列表排序修改集合嗎?請問列表<T>排序修改集合嗎?

我認爲它必須爲我得到一個「System.InvalidOperationException:集合被修改;枚舉操作可能不會執行。」另一個線程中的異常。

在我的多線程應用程序中,我認爲所有線程只是讀取集合,但一個線程進行排序。

感謝

+3

排序集合不應該修改單個元素,但它會明顯修改* collection *。 – 2012-03-25 15:12:30

+0

但它會導致修改的集合異常嗎? – CodingHero 2012-03-25 15:13:43

+0

看看這個問題 - http://stackoverflow.com/questions/604831/collection-was-modified-enumeration-operation-may-not-execute – 2012-03-25 15:14:05

回答

6

是,Sort是原地的,如果這是你的意思,它肯定會作廢任何迭代器。

如果您想查看集合的排序「視圖」,可以使用LINQ的OrderBy運算符,該運算符不會修改現有集合,但會返回包含原始集合中元素的序列,但在給定訂購。

因此,例如,而不是:

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

你可以使用:

foreach (string name in names.OrderBy(x => x)) 
{ 
    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();