订购ObservableCollection <T>而不创建新的

sea*_*717 21 c#

我有以下代码来重新订购ObservableCollection<T>集合:

list = new ObservableCollection<SomeType>( list.OrderBy( c=>c.Ordinal ) );
Run Code Online (Sandbox Code Playgroud)

这段代码有效,但我不喜欢涉及"新"的事实.有没有办法可以在ObservableCollection<T>不创建新集合的情况下更改集合的内部元素顺序?

谢谢,

spe*_*der 10

鉴于这OrderBy也是一个数组的新闻,以匹配您的集合的大小,以及其他几个对象,您有两个选择:

  1. 放弃LINQ OrderBy并编写自己的排序,使用Move方法对ObservableCollection执行就地排序.
  2. 等到当前实现出现问题然后应用1.

别担心,新东西并不是那么可怕.Linq一直都这么做.除非它是一个瓶颈,否则一切都很好.除非有令人信服的证据证明就地排序会真正加速节目,否则这里没有问题.

  • 这样做的问题是你会在可观察集合上放松任何观察者. (5认同)
  • 有一些客户端(例如:Windows Store 应用程序)使用事件(创建、移动、删除等)对 ObservableCollection 中已删除或移动的项目进行动画处理。重新创建 ObservableCollection 毫无意义! (2认同)

bkk*_*bkk 10

为Observable集合实现自定义排序扩展方法

 public static class ObservableCollection
 {
      public static void Sort<TSource, TKey>(this ObservableCollection<TSource> source, Func<TSource, TKey> keySelector)
      {
          List<TSource> sortedList = source.OrderBy(keySelector).ToList();
          source.Clear();
          foreach (var sortedItem in sortedList)
          {
              source.Add(sortedItem);
          }
     }
 }
Run Code Online (Sandbox Code Playgroud)

上面的回答是受到Jaider先生对这个问题的回答的启发


Dev*_*per 6

我的答案受到了bkk的启发

 public static class ObservableCollection
    {
        public static void Sort<TSource, TKey>(this ObservableCollection<TSource> source, Func<TSource, TKey> keySelector, bool isAZ)
        {
            if (isAZ)
            {
                List<TSource> sortedList = source.OrderBy(keySelector).ToList();
                source.Clear();
                foreach (var sortedItem in sortedList)
                {
                    source.Add(sortedItem);
                }
            }
            else
            {
                List<TSource> sortedList = source.OrderByDescending(keySelector).ToList();
                source.Clear();
                foreach (var sortedItem in sortedList)
                {
                    source.Add(sortedItem);
                }
            }         
        }
    }
Run Code Online (Sandbox Code Playgroud)

用法

 _someObservableCollection.Sort(x => x.Number, false); // Where number is an simple property (non-onject)
Run Code Online (Sandbox Code Playgroud)

  • `isAZ`不是很直观,但这是@ bkk答案的改进.+1 (2认同)
  • 是的,我想我称之为"降序",但其他方面却很棒. (2认同)

Onk*_*org 5

据我所知,ObservableCollection具有在集合内移动项目的方法。您应该为您的T型车得到一个比较器,然后使用某种排序算法