订购ObservableCollection 而不创建新的

我有以下代码重新订购ObservableCollection集合:

 list = new ObservableCollection( list.OrderBy( c=>c.Ordinal ) ); 

这段代码有效,但我不喜欢涉及“新”的事实。 有没有办法可以更改ObservableCollection集合的内部元素顺序而不创建新的元素顺序?

谢谢,

鉴于OrderBy还会新闻数组以匹配您的集合的大小以及其他几个对象,您有两种选择:

  1. 完全放弃LINQ OrderBy并编写自己的排序,使用Move方法对ObservableCollection执行就地排序。
  2. 等到当前实现出现问题然后应用1。

别担心,新东西并不是那么可怕。 Linq一直都这么做。 除非它是一个瓶颈,否则一切都很好。 除非有令人信服的证据certificate就地排序会真正加速节目,否则这里没有问题。

为Observable集合实现自定义排序扩展方法

  public static class ObservableCollection { public static void Sort(this ObservableCollection source, Func keySelector) { List sortedList = source.OrderBy(keySelector).ToList(); source.Clear(); foreach (var sortedItem in sortedList) { source.Add(sortedItem); } } } 

以上答案的灵感来自Jaider先生对这个问题的回答

我的回答是受到bkk的启发

  public static class ObservableCollection { public static void Sort(this ObservableCollection source, Func keySelector, bool isAZ) { if (isAZ) { List sortedList = source.OrderBy(keySelector).ToList(); source.Clear(); foreach (var sortedItem in sortedList) { source.Add(sortedItem); } } else { List sortedList = source.OrderByDescending(keySelector).ToList(); source.Clear(); foreach (var sortedItem in sortedList) { source.Add(sortedItem); } } } } 

用法

  _someObservableCollection.Sort(x => x.Number, false); // Where number is an simple property (non-onject) 

据我所知,ObservableCollection具有在集合中移动项目的方法。 您应该为您的T型获得比较器,然后使用一些排序算法