我有一个可观察的集合,我使用linq进行排序。一切都很好,但我的问题是如何对实际可观察集合进行排序?相反,我只是最终得到了一些IEnumerable的东西,最后我清理了这个集合并添加了这些东西。这对性能没有好处。有谁知道更好的方法来做到这一点?用linq排序可观察的集合
回答
如果您在使用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}"
为列表框或任何ItemsControl的导出的控制
请注意,在Linq中,您会收到来自您的查询的IEnumerable,并且该查询尚未执行。因此,下面的代码只运行一次查询,将它添加到一个ObservableCollection:由于收不
我用这个作为基础类似的东西我码。我开始认为Linq是很棒的屁股:) – djcouchycouch 2009-08-20 19:45:43
我不确定如果你从WCF服务中获得ObservableCollection,这会有什么效果,有什么建议吗?我是否需要在客户端上创建一个新的ObservableCollection并将“OrderBy”应用于它? - 谢谢。 – VoodooChild 2010-08-24 02:59:06
@VoodooChild:如果你已经有一个ObservableCollection而不只是一个IEnumerable,那么看看这个SO问题:http://stackoverflow.com/questions/996126/sorting-an-observable-collection-with-linq – 2010-08-25 16:23:16
:
var query = from x in Data
where x.Tag == "Something"
select x;
foreach(var item in query)
MyObservableCollection.Add(item);
在“OrderBy”扩展上的IEnumerable看看提供任何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();
}
ObservableCollections不能排序。 List是可排序的,这是引用List.Sort()的答案使用的底层机制,但ObservableCollection不是从List派生的,因此您在那里运气不佳。 Imo,“正确的”解决方案不是尝试对ObservableCollection进行排序,而是实现ICollectionView并将其绑定到您的控件的实例。该接口添加了用于排序的方法,并且具有Silverlight控件所识别的额外好处(以及支持DataGrid的那些控件,例如DataGrid),因此您的排序可以直接从UI层使用。这个问题可能会有所帮助:
我随后提到的链路在这篇文章中http://mokosh.co.uk/post/2009/08/04/how-to-sort-observablecollection/comment-page-1/#comment-75
但有问题让它在Silverlight中工作
我创建了一个属性public SortableObservableCollection条款 当我打电话Terms.Sort(新TermComparer())的记录仍然在UI
显示未排序的可能有些什么建议可能会错误。感谢
- 1. 透视可观察集合
- 2. 只读可观察集合
- 3. 在MVVM光源中获取已排序的可观察集合
- 4. 如何对可观察的集合进行排序?
- 5. 对绑定的可观察集合进行排序
- 6. 观察集合
- 7. 如何排序/过滤器观察到的集合,并取回观察到的集合不是IEnumerable的
- 8. Windows Phone上的可观察集合和Linq for Silverlight
- 9. 当前项目的可观察集合?
- 10. 实现可观察集合的问题
- 11. Datagrid可观察集合的多视图
- 12. 的Javascript观察集合数
- 13. 创建可观察列表/集合
- 14. Silverlight DataGrid刷新可观察集合
- 15. Silverlight 3 - 过滤可观察集合
- 16. 从可观察集合创建XML树
- 17. 将可观察集合绑定到GridView
- 18. 可观察集合深拷贝
- 19. 如何更新可观察集合组
- 20. XAML绑定可观察集合到DataGrid
- 21. 绑定两个可观察集合
- 22. RxSwift可观察的数组排序
- 23. knockout.js排序的可观察数组
- 24. 可观察集合与可枚举集合有什么区别?
- 25. 使用LINQ to从观察到的集合
- 26. 在windows phone 7应用程序中更新可观察集合
- 27. LINQ查询排序集合
- 28. 平映射在观察集合观察到的性质RxSwift
- 29. 组合可观察对象
- 30. .NET:可观察+可排序的CollectionView的一个集(定制HasSet <>)
的可能的复制[排序的ObservableCollection C#(http://stackoverflow.com/questions/19112922/sort-observablecollectionstring-c-sharp) –
2017-02-15 07:55:11