列表排序会修改集合吗?
我认为必须得到“System.InvalidOperationException:Collection已被修改;枚举操作可能无法执行。”另一个线程上的异常。
在我的多线程应用程序中,我认为所有线程都只是读取集合但是一个线程会进行排序。
由于
答案 0 :(得分: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);
}
另一种选择是在第一次填充列表时,在任何事情开始迭代之前对其进行排序 - 这是仅需要 的修改,以及排序顺序是否会发生变化(例如由于对列表中提到的对象的修改)那么只做一次是有意义的。
答案 1 :(得分: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();