C# .NET:可观察的+;集合上的可排序集合视图(自定义HasSet<;>;)

C# .NET:可观察的+;集合上的可排序集合视图(自定义HasSet<;>;),c#,.net,collections,view,set,C#,.net,Collections,View,Set,我在寻找一种不用索引观察集合变化的方法。我知道何时在源集合中添加和删除项,但集合没有使用索引(这是一种自定义的hashset,在添加/删除时会发出通知)。项目以不确定的顺序填充到列表中,使用索引没有多大意义,所以我试图完全避免它。但我还是要将这个列表绑定到一个视图,所以最终会有一些项目的排序。我的目标是在collectionview中进行所有订购 问题是,是否有一种方法可以在无索引的源集合上创建collectionview,并且仍然可以让UI有效地响应被删除和添加的项,而无需每次重建列表。我不确

我在寻找一种不用索引观察集合变化的方法。我知道何时在源集合中添加和删除项,但集合没有使用索引(这是一种自定义的hashset,在添加/删除时会发出通知)。项目以不确定的顺序填充到列表中,使用索引没有多大意义,所以我试图完全避免它。但我还是要将这个列表绑定到一个视图,所以最终会有一些项目的排序。我的目标是在collectionview中进行所有订购

问题是,是否有一种方法可以在无索引的源集合上创建collectionview,并且仍然可以让UI有效地响应被删除和添加的项,而无需每次重建列表。我不确定我在这里是否有意义。我的目标是摆脱索引,但仍然受益于collectionchanged事件和collectionview排序。可能吗

更新

我曾尝试实现一个定制的ICollectionView,比如SetCollectionView(HashSet-set),但由于某些原因它无法工作。反正还没有


另一个选项可能是在GetEnumerator上实现一个自定义ReadOnlyObservableCollection包装器,并带有一些自定义顺序。我还没有测试过。在提取NotifyCollectionChanged事件的索引之前,我必须根据choosen排序对列表进行排序,但这应该是可行的。

您需要在某个地方有一个索引,因为所有UI绑定管道都是基于索引的。您可以在现有哈希集上分层索引列表,但速度会很慢(我无法提供正式的证明,但我的直觉告诉我这将非常糟糕,类似于O(n))。如果您想要一个快速的基本集合,可以将重新排序的UI列表分层,那么您可能需要查看一个平衡的排序树,而不是哈希集。

您可以使用ObservableHashSet类

看到问题了吗

或者直接转到此处的代码:


如果不是索引,那么订单的定义是什么?哈希集是一种显式的无序数据结构。如果哈希集是无序的,那么您希望如何知道要删除哪些项。。?还有,你为什么想要一个无索引的自定义集合呢?在我的例子中,我对项目的位置不是很感兴趣,只有当它们是否是集合/集合的一部分时。顺序取决于表示层和视图层。删除项目时,我使用的不是RemoveAt(0),而是Remove(item)。默认情况下,源集合中的项目彼此不可比较,因此排序树在这里没有多大用处,我想。。。