我有一个可观察集合,并使用linq进行排序。一切都很好,但我的问题是如何对实际的可观察集合进行排序?我只是得到了一些IEnumerable的东西,最后不得不清空集合并重新添加内容。这对性能肯定不利。有人知道更好的方法吗?
我有一个可观察集合,并使用linq进行排序。一切都很好,但我的问题是如何对实际的可观察集合进行排序?我只是得到了一些IEnumerable的东西,最后不得不清空集合并重新添加内容。这对性能肯定不利。有人知道更好的方法吗?
如果你正在使用Silverlight 3.0,那么使用CollectionViewSource是最干净的方法。请参考以下示例:(也可以通过xaml完成)
ObservableCollection<DateTime> ecAll = new ObservableCollection<DateTime>();
CollectionViewSource sortedcvs = new CollectionViewSource();
sortedcvs.SortDescriptions.Add(new System.ComponentModel.SortDescription("Date",
System.ComponentModel.ListSortDirection.Ascending));
sortedcvs.Source = ecAll;
ListBoxContainer.DataContext = sortedcvs;
同时在对应的XAML中设置
ItemsSource="{Binding}"
对于ListBox或任何派生自ItemsControl的控件
Move
等实现排序,但这可能比以这种方式进行更慢。 var arr = list.OrderBy(x => x.SomeProp).ToArray();
list.Clear();
foreach (var item in arr) {
list.Add(item);
}
var arr = list.OrderBy(x => x).ToArray();
bool oldRaise = list.RaiseListChangedEvents;
list.RaiseListChangedEvents = false;
try {
list.Clear();
foreach (var item in arr) {
list.Add(item);
}
} finally {
list.RaiseListChangedEvents = oldRaise;
if (oldRaise) list.ResetBindings();
}
var ordered = list.OrderBy(x => x.SomeProp); list.Clear(); list.AddRange(ordered);
。这样可以避免不必要的迭代和执行ToArray(),并且只在AddRange()期间执行一次。 (我需要反编译来验证这一点,因为AddRange接受一个IEnumerable,它甚至可能只存储而不执行它,然后在调用任何List特定操作之前执行和存储扁平化集合。最终具有相同的性能,但它只是将周期命中推迟到稍后。) - JoeBrockhausvar query = from x in Data
where x.Tag == "Something"
select x;
foreach(var item in query)
MyObservableCollection.Add(item);
请看IEnumerable上的"OrderBy"扩展:
foreach(var item in query.OrderBy(x => x.Name))
MyObservableCollection.Add(item);
我按照这篇文章中提到的链接 http://mokosh.co.uk/post/2009/08/04/how-to-sort-observablecollection/comment-page-1/#comment-75 进行了操作
但是在 Silverlight 中无法正常工作
我创建了一个名为 public SortableObservableCollection Terms 的属性 当我调用 Terms.Sort(new TermComparer()) 时,记录仍然以未排序的方式显示在 UI 上
有人能建议可能出了什么问题,谢谢