2009-06-15 152 views
20

我有一个可观察的集合,我使用linq进行排序。一切都很好,但我的问题是如何对实际可观察​​集合进行排序?相反,我只是最终得到了一些IEnumerable的东西,最后我清理了这个集合并添加了这些东西。这对性能没有好处。有谁知道更好的方法来做到这一点?用linq排序可观察的集合

+0

的可能的复制[排序的ObservableCollection C#(http://stackoverflow.com/questions/19112922/sort-observablecollectionstring-c-sharp) – 2017-02-15 07:55:11

回答

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}" 

为列表框或任何ItemsControl的导出的控制

3

请注意,在Linq中,您会收到来自您的查询的IEnumerable,并且该查询尚未执行。因此,下面的代码只运行一次查询,将它添加到一个ObservableCollection:由于收不

​​
+0

我用这个作为基础类似的东西我码。我开始认为Linq是很棒的屁股:) – djcouchycouch 2009-08-20 19:45:43

+0

我不确定如果你从WCF服务中获得ObservableCollection,这会有什么效果,有什么建议吗?我是否需要在客户端上创建一个新的ObservableCollection并将“OrderBy”应用于它? - 谢谢。 – VoodooChild 2010-08-24 02:59:06

+0

@VoodooChild:如果你已经有一个ObservableCollection而不只是一个IEnumerable,那么看看这个SO问题:http://stackoverflow.com/questions/996126/sorting-an-observable-collection-with-linq – 2010-08-25 16:23:16

8

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(); 
    } 
3

ObservableCollections不能排序。 List是可排序的,这是引用List.Sort()的答案使用的底层机制,但ObservableCollection不是从List派生的,因此您在那里运气不佳。 Imo,“正确的”解决方案不是尝试对ObservableCollection进行排序,而是实现ICollectionView并将其绑定到您的控件的实例。该接口添加了用于排序的方法,并且具有Silverlight控件所识别的额外好处(以及支持DataGrid的那些控件,例如DataGrid),因此您的排序可以直接从UI层使用。这个问题可能会有所帮助:

Silverlight and icollectionview