订购ObservableCollection 而不创建新的
我有以下代码重新订购ObservableCollection
集合:
list = new ObservableCollection( list.OrderBy( c=>c.Ordinal ) );
这段代码有效,但我不喜欢涉及“新”的事实。 有没有办法可以更改ObservableCollection
集合的内部元素顺序而不创建新的元素顺序?
谢谢,
鉴于OrderBy
还会新闻数组以匹配您的集合的大小以及其他几个对象,您有两种选择:
- 完全放弃LINQ OrderBy并编写自己的排序,使用Move方法对ObservableCollection执行就地排序。
- 等到当前实现出现问题然后应用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型获得比较器,然后使用一些排序算法