我有一个可观察的集合,我使用linq对它进行排序。一切都很好,但我遇到的问题是如何对实际的可观察集合进行排序?相反,我最终得到一些IEnumerable东西,我最终清理了收集并重新添加了东西。这对性能来说不是好事。有谁知道更好的方法吗?
答案 0 :(得分:15)
如果您使用的是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派生控件
答案 1 :(得分:9)
由于集合不提供任何Sort
机制,这可能是最实用的选择。您可以使用Move
等手动实现排序,但它可能比以这种方式更慢。
var arr = list.OrderBy(x => x.SomeProp).ToArray();
list.Clear();
foreach (var item in arr) {
list.Add(item);
}
此外,您可能会考虑在排序时解锁任何UI元素(通过任一方法),您只需重新绑定一次:
有趣的是,如果这是BindingList<T>
,您可以使用RaiseListChangedEvents
来最小化通知数量:
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();
}
答案 2 :(得分:3)
请注意,在Linq中,您从查询中获得了IEnumerable,并且该查询尚未执行。因此,以下代码仅运行查询一次,以将其添加到ObservableCollection:
var 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);
答案 3 :(得分:3)
ObservableCollections不是可排序的。 List是可排序的,这是引用List.Sort()的答案所使用的基础机制,但ObservableCollection不是从List派生的,所以你在那里运气不好。 Imo,“正确”的解决方案不是尝试对ObservableCollection进行排序,而是实现ICollectionView并将其实例绑定到您的控件。该接口添加了排序方法,并具有Silverlight控件识别的额外好处(好吧,无论如何都支持它,如DataGrid),因此可以直接从UI层使用您的排序。这个问题可能会有所帮助:
答案 4 :(得分:0)
我按照这篇文章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上显示未分类
可能会有人提出可能出现的问题。感谢
答案 5 :(得分:0)