订购ObservableCollection <t>而不创建新的</t>

时间:2010-10-19 21:57:52

标签: c#

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

list = new ObservableCollection<SomeType>( list.OrderBy( c=>c.Ordinal ) );

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

谢谢,

4 个答案:

答案 0 :(得分:9)

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

  1. 完全放弃LINQ OrderBy并编写自己的排序,使用Move方法对ObservableCollection执行就地排序。
  2. 等到当前实施出现问题然后应用1。
  3. 别担心,新东西并不是那么可怕。 Linq一直都这么做。除非它是一个瓶颈,否则一切都很好。除非有令人信服的证据表明就地排序会真正加速节目,所以这里没有问题。

答案 1 :(得分:9)

为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);
          }
     }
 }

以上回答的灵感来自Jaider先生对此question

的回复

答案 2 :(得分: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);
                }
            }         
        }
    }

<强>用法

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

答案 3 :(得分:4)

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