【发布时间】:2011-12-07 07:17:44
【问题描述】:
我已阅读 this question 了解为什么这是不可能的,但还没有找到解决问题的方法。
我想从 .NET HashSet<T> 中检索项目。我正在寻找一种具有此签名的方法:
/// <summary>
/// Determines if this set contains an item equal to <paramref name="item"/>,
/// according to the comparison mechanism that was used when the set was created.
/// The set is not changed. If the set does contain an item equal to
/// <paramref name="item"/>, then the item from the set is returned.
/// </summary>
bool TryGetItem<T>(T item, out T foundItem);
用这种方法在集合中搜索一个项目将是 O(1)。从HashSet<T> 中检索项目的唯一方法是枚举所有 O(n) 的项目。
除了创建自己的HashSet<T> 或使用Dictionary<K, V> 之外,我没有找到任何解决此问题的方法。还有什么想法吗?
注意:
我不想检查 HashSet<T> 是否包含该项目。我想获取对存储在HashSet<T> 中的项目的引用,因为我需要更新它(而不用另一个实例替换它)。我将传递给TryGetItem 的项目将是相等的(根据我传递给构造函数的比较机制),但它不会是相同的引用。
【问题讨论】:
-
为什么不使用 Contains 并返回您作为输入传递的项目?
-
如果您需要根据键值查找对象,那么 Dictionary
可能是更合适的集合来存储它。 -
@ThatBlairGuy:你是对的。我想我会在内部使用 Dictionary 来实现我自己的 Set 集合来存储我的项目。键将是项目的 HashCode。我将具有与 HashSet 大致相同的性能,并且每次我需要从我的集合中添加/删除/获取项目时都不必提供密钥。
-
@mathias 因为哈希集可能包含一个等于输入的项目,但实际上并不相同。例如,您可能想要一个引用类型的哈希集,但您想要比较内容,而不是相等的引用。