我有以下代码来重新订购ObservableCollection<T>
集合:
list = new ObservableCollection<SomeType>( list.OrderBy( c=>c.Ordinal ) );
此代码有效,但我不喜欢涉及“新”的事实。有没有办法可以在不创建新的ObservableCollection<T>
集合的情况下更改内部元素顺序?
谢谢,
答案 0 :(得分:9)
鉴于OrderBy
也会新闻数组以匹配您的集合的大小以及其他几个对象,您有两种选择:
别担心,新东西并不是那么可怕。 Linq一直都这么做。除非它是一个瓶颈,否则一切都很好。除非有令人信服的证据表明就地排序会真正加速节目,所以这里没有问题。
答案 1 :(得分:9)
为Observable集合实现自定义排序扩展方法
public static class ObservableCollection
{
public static void Sort<TSource, TKey>(this ObservableCollection<TSource> source, Func<TSource, TKey> keySelector)
{
List<TSource> sortedList = source.OrderBy(keySelector).ToList();
source.Clear();
foreach (var sortedItem in sortedList)
{
source.Add(sortedItem);
}
}
}
以上回答的灵感来自Jaider先生对此question
的回复答案 2 :(得分:6)
我的答案受到bkk
的启发 public static class ObservableCollection
{
public static void Sort<TSource, TKey>(this ObservableCollection<TSource> source, Func<TSource, TKey> keySelector, bool isAZ)
{
if (isAZ)
{
List<TSource> sortedList = source.OrderBy(keySelector).ToList();
source.Clear();
foreach (var sortedItem in sortedList)
{
source.Add(sortedItem);
}
}
else
{
List<TSource> 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)
答案 3 :(得分:4)
据我所知,ObservableCollection具有在集合中移动项目的方法。你应该得到一个T型比较器,然后使用一些排序算法