C# 订购可观察到的集合<;T>;没有创建一个新的
我有以下代码来重新订购C# 订购可观察到的集合<;T>;没有创建一个新的,c#,C#,我有以下代码来重新订购observetecollection集合: list = new ObservableCollection<SomeType>( list.OrderBy( c=>c.Ordinal ) ); list=newobserveCollection(list.OrderBy(c=>c.Ordinal)); 这段代码很有效,但我不喜欢涉及“新”的事实。有没有一种方法可以在不创建新集合的情况下更改ObservableCollection集合的内部元素顺序 谢
observetecollection
集合:
list = new ObservableCollection<SomeType>( list.OrderBy( c=>c.Ordinal ) );
list=newobserveCollection(list.OrderBy(c=>c.Ordinal));
这段代码很有效,但我不喜欢涉及“新”的事实。有没有一种方法可以在不创建新集合的情况下更改ObservableCollection
集合的内部元素顺序
谢谢,据我所知,ObservableCollection有一种方法可以在集合中移动项目。您应该为您的T-type获取一个比较器,然后使用一些排序算法鉴于
OrderBy
也会生成一个数组以匹配集合的大小,以及其他几个对象,您有两种选择:
别担心,更新东西并不可怕。林克总是这样做。除非是瓶颈,否则一切都好。除非有令人信服的证据表明,适当的排序将真正加快展示速度,否则这里没有问题。为可观察的收集实现自定义排序扩展方法
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);
}
}
}
公共静态类ObservableCollection
{
公共静态无效排序(此ObservableCollection源,Func keySelector)
{
List sortedList=source.OrderBy(keySelector.ToList();
source.Clear();
foreach(分拣列表中的var分拣数据项)
{
来源.添加(sortedItem);
}
}
}
以上答案的灵感来源于Jaider先生对此的回答我的答案的灵感来源于
一种非常复杂的方法是可用的,特别是因为项目本身不是新的,而只是包含集合。更改集合对象还将导致INPC绑定刷新并显示新顺序。这样做的问题是,您将失去可观察集合上的任何观察者。有些客户端(例如:Windows应用商店应用程序)使用事件(创建、移动、移除等)为可观察集合中删除或移动的项目设置动画。重新创建ObservableCollection是毫无意义的
isAZ
不是很直观,但这是@bkk答案的改进+1是的,我想我会称之为下降,但除此之外,答案很棒。
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)