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

zac*_*ary 20 linq silverlight observablecollection

我有一个可观察的集合,我用linq对它进行排序.一切都很好,但我遇到的问题是如何对实际的可观察集合进行排序?相反,我刚刚结束了与一些IEnumerable的事情,我最终结算的收集和添加的东西回.这不利于性能.有谁知道更好的方法吗?

moo*_*ock 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;
Run Code Online (Sandbox Code Playgroud)

并在相应的xaml集中

ItemsSource="{Binding}"
Run Code Online (Sandbox Code Playgroud)

对于ListBox或任何ItemsControl派生控件


Mar*_*ell 9

由于该集合不提供任何Sort机制,这可能是最实用的选择.你可以使用Moveetc 手动实现排序,但它可能比这样做慢.

    var arr = list.OrderBy(x => x.SomeProp).ToArray();
    list.Clear();
    foreach (var item in arr) {
        list.Add(item);
    }
Run Code Online (Sandbox Code Playgroud)

此外,您可能会考虑在排序时解锁任何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();
    }
Run Code Online (Sandbox Code Playgroud)