使用linq对可观察集合进行排序

时间:2009-06-15 13:29:59

标签: linq silverlight observablecollection

我有一个可观察的集合,我使用linq对它进行排序。一切都很好,但我遇到的问题是如何对实际的可观察集合进行排序?相反,我最终得到一些IEnumerable东西,我最终清理了收集并重新添加了东西。这对性能来说不是好事。有谁知道更好的方法吗?

6 个答案:

答案 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层使用您的排序。这个问题可能会有所帮助:

Silverlight and icollectionview

答案 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)

我在CodePlex上找到了这个:

Sorted Collections

虽然还没有使用它。

瑞克