List <t> Sort是否修改集合?</t>

时间:2012-03-25 15:11:01

标签: c# .net

列表排序会修改集合吗?

我认为必须得到“System.InvalidOperationException:Collection已被修改;枚举操作可能无法执行。”另一个线程上的异常。

在我的多线程应用程序中,我认为所有线程都只是读取集合但是一个线程会进行排序。

由于

2 个答案:

答案 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();