C# 订购可观察到的集合<;T>;没有创建一个新的

C# 订购可观察到的集合<;T>;没有创建一个新的,c#,C#,我有以下代码来重新订购observetecollection集合: list = new ObservableCollection<SomeType>( list.OrderBy( c=>c.Ordinal ) ); list=newobserveCollection(list.OrderBy(c=>c.Ordinal)); 这段代码很有效,但我不喜欢涉及“新”的事实。有没有一种方法可以在不创建新集合的情况下更改ObservableCollection集合的内部元素顺序 谢

我有以下代码来重新订购
observetecollection
集合:

list = new ObservableCollection<SomeType>( list.OrderBy( c=>c.Ordinal ) );
list=newobserveCollection(list.OrderBy(c=>c.Ordinal));
这段代码很有效,但我不喜欢涉及“新”的事实。有没有一种方法可以在不创建新集合的情况下更改
ObservableCollection
集合的内部元素顺序


谢谢,

据我所知,ObservableCollection有一种方法可以在集合中移动项目。您应该为您的T-type获取一个比较器,然后使用一些排序算法

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

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

  • 别担心,更新东西并不可怕。林克总是这样做。除非是瓶颈,否则一切都好。除非有令人信服的证据表明,适当的排序将真正加快展示速度,否则这里没有问题。

    为可观察的收集实现自定义排序扩展方法

     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);
              }
         }
     }
    
    公共静态类ObservableCollection
    {
    公共静态无效排序(此ObservableCollection源,Func keySelector)
    {
    List sortedList=source.OrderBy(keySelector.ToList();
    source.Clear();
    foreach(分拣列表中的var分拣数据项)
    {
    来源.添加(sortedItem);
    }
    }
    }
    

    以上答案的灵感来源于Jaider先生对此的回答

    我的答案的灵感来源于


    一种非常复杂的方法是可用的,特别是因为项目本身不是新的,而只是包含集合。更改集合对象还将导致INPC绑定刷新并显示新顺序。这样做的问题是,您将失去可观察集合上的任何观察者。有些客户端(例如:Windows应用商店应用程序)使用事件(创建、移动、移除等)为可观察集合中删除或移动的项目设置动画。重新创建ObservableCollection是毫无意义的
    isAZ
    不是很直观,但这是@bkk答案的改进+1是的,我想我会称之为下降,但除此之外,答案很棒。
     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)