在可观察集合上使用LINQ,而不会丢失事件订阅C#

问题描述 投票:0回答:1

我正在尝试使用LINQ对ObservableCollection进行排序,问题是LINQ的方法返回IOrderedEnumerable,并且没有方法将该类型直接转换为ObservableCollection。搜索了一会后,我发现了一种方法,可以使用ObservableCollection类中的构造函数使用IOrderedEnumerable创建一个新的构造函数:

MyObservableCollection = new ObservableCollection<T>(someIOrderedEnumerable);

但是,这不能解决我的问题,因为通过使用此构造函数,先前的EventHandler被擦除,因此我丢失了对先前订阅CollectionChanged事件的所有方法的引用,并且无法再次订阅这些方法。

[目前,我正在清除Observable Collection,然后将LINQ方法返回的对象一一添加到Observable Collection中,问题在于,每次我使用LINQ进行排序时,都会多次触发CollectionChanged事件它:

var iOrderedEnumerable = MyObservableCollection.SomeLINQMethod();
MyObservableCollection.Clear();
var pivotList = iOrderedEnumerable.ToList();
for (int i = 0; i < pivotList.Count; i++)
  {
      MyObservableCollection.Add(pivotList[i]);
  }

主要问题是:如何在不丢失CollectionChanged事件的订阅的情况下订购可观察的集合?

我曾考虑过存储EventHandler并在创建新的已排序Observable集合后重新分配它,但尚未能够实现它。

Edit1:修改了一会儿之后,我想出了一种只对集合排序的LINQ方法的解决方案,而不是清除Observable集合,然后一个接一个地添加,我只是简单地设置了值(这不会触发CollectionChanged事件):] >

var iOrderedEnumerable = MyObservableCollection.SomeLINQMethod();
var pivotList = iOrderedEnumerable.ToList();
for (int i = 0; i < pivotList.Count; i++)
    {
        MyObservableCollection[i] = pivotList[i];
    }

我正在尝试使用LINQ对ObservableCollection进行排序,问题是LINQ的方法返回IOrderedEnumerable,并且没有方法将该类型直接转换为ObservableCollection。之后...

c# linq unity3d observablecollection iorderedenumerable
1个回答
0
投票
© www.soinside.com 2019 - 2024. All rights reserved.