【问题标题】:.NET: Observable + Sortable CollectionView on a Set (custom HasSet<>).NET:集合上的 Observable + Sortable CollectionView(自定义 HasSet<>)
【发布时间】:2012-02-06 03:35:09
【问题描述】:

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

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

更新

我尝试实现自定义 ICollectionView,例如 SetCollectionView(HashSet set),但由于某种原因无法正常工作。反正还没有。

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

【问题讨论】:

  • 如果不是索引,什么定义您的订单?哈希集是一种明确无序的数据结构。
  • 如果一个 HashSet 是无序的,那么你怎么知道要删除哪些项目 Andreas..?以及为什么您仍然想要一个无索引的自定义集合..??
  • 在我的情况下,我对项目的位置不是很感兴趣,除非它们是集合/集合的一部分。排序取决于表示层和视图层。删除项目时,我没有使用 RemoveAt(0) 而是 Remove(item)。

标签: c# .net collections view set


【解决方案1】:

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

【讨论】:

  • 源集合中的项目默认情况下不能相互比较,所以我猜排序树在这里用处不大......
【解决方案2】:

您可以使用 ObservableHashSet 类。

在这里查看问题

How can I make an Observable Hashset in C#?

或者直接看这里的代码:

http://geoffcox.bellacode.com/2011/12/09/observablehashset/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-23
    • 1970-01-01
    • 2018-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多