|
|
1
11
在.Net中,您可能要查找的是KeyedCollection http://msdn.microsoft.com/en-us/library/ms132438.aspx 您可以通过一些“通用”的技巧来避免每次重新实现这个抽象类的麻烦。(见Ikeydobject`1。) 注意:实现IKeyDobject`1的任何数据传输对象都应该有一个重写的GetHashCode方法,只返回这个.Key.GetHashCode();平等也是如此。。。 我的基类库通常以如下内容结束:
|
|
|
2
9
您打算如何从哈希集中检索该项?根据定义,集合不以任何方式排序,因此,没有用于检索相关对象的索引。 编辑:基于对原始问题的编辑的附加答案 Soonil,根据您的新信息,您可能有兴趣将数据实现为Java枚举,类似于:
Enum的automatically inherit values()返回Enum“集合”中所有值的列表,您可以使用该列表以与集合相同的方式对其进行包含性测试。另外,因为它是一个完整的类,所以可以定义新的静态方法来执行复合逻辑(就像我在示例代码中试图提及的那样)。关于枚举的唯一一点是,您不能在运行时添加新实例,这可能不是您想要的(尽管如果集合的数据大小在运行时不会增长,那么枚举就是您想要的)。 |
|
|
3
4
如果在插入对象后对其进行更改,则其哈希值可能已更改(如果已重写hashCode(),则这种情况尤其可能发生)。如果散列值发生更改,则在集合中查找它将失败,因为您将尝试查找散列在与其存储位置不同的位置的对象。 此外,如果要查找属于不同实例的相等对象,则需要确保覆盖了对象中的hashCode和equals。
|
|
|
4
3
我想象着这个世界的设计师们
此外,如果要删除的对象在逻辑上等于传递给remove(对象)的对象,那么在返回包含的对象时添加的值是有争议的。然而,我以前也遇到过这个问题,并且用地图解决了这个问题。
|
|
|
5
3
为什么不直接使用
|
|
|
6
3
这是图书馆设计师的疏忽。正如我在下面提到的
another answer
,此方法已添加到
.NET Framework 4.7.2
.NET Core 2.0
在它之前);看见
|
|
|
7
1
在我看来你真的在找一个
(下文)
|
|
|
8
1
. 希望找到一个元素对我来说似乎完全有效,因为用于搜索的代表可能与找到的元素不同。如果元素包含键和值信息,并且自定义相等比较器仅比较键部分,则尤其如此。请参见代码示例。该代码包含一个实现自定义搜索的比较器 和
|
|
|
9
0
这些语言中的Set对象大多设计为值集,而不是可变对象。它们使用equals检查放入其中的对象是否唯一。这就是为什么contains和remove返回布尔值,而不是对象:它们检查或删除传递给它们的值。 实际上,如果你在一个集合上做一个包含(X),并期望得到一个不同的对象Y,这意味着X和Y是相等的(即X.equals(Y)=>true),但有些不同,这似乎是错误的。 |
|
|
10
0
有人给了我一个有趣的建议,让我自己的对象将自己定义为KeyValuePairs,以此来使用映射。虽然这是一个很好的概念,但不幸的是KeyValuePair不是一个接口(为什么不?),而是一个结构,它将该计划抛诸脑后。最后,我将滚动我自己的集合,因为我的约束允许我使用此选项。 |
|
|
11
0
简短的回答;因为不能保证这些项是不可变的。 我遇到了您描述的确切问题,其中HashCode基于成员类中的固定字段,但该类包含可以在不更改hash的情况下更新的附加信息。 我的解决方案是实现一个通用的MyHashSet<T>基于ICollection<T>但却裹着一本字典<int,List<T>&燃气轮机;为了提供所需的查找效率,其中int键是T的HashCode。但是,这表明如果成员对象的HashCode可以更改,那么字典查找之后对列表中的项进行相等比较将永远找不到更改的项。没有强制成员不可变的机制,因此唯一的解决方案是枚举批次。 |
|
12
0
在对同样的事情感到疑惑,并且能够仔细查看源代码之后: 资料来源: http://referencesource.microsoft.com/#System.Core/System/Collections/Generic/HashSet.cs 集合是唯一项(对象或值)的集合。在.net实现中,如果比较器的Equals方法为两个项返回true,则一个项与另一个项相同(不是唯一的)。如果这两个项具有相同的哈希代码,则不会。因此,检查项目是否存在是一个分两步的过程。首先使用哈希集最小化要压缩的项目数,然后压缩本身。
可以创建一个数据结构,要求没有两个唯一的项返回相同的哈希代码。然后你就可以从中得到一件物品。添加*会更快,如果您知道哈希,则可以进行检索。如果将两个不相等但返回相同哈希的项放入其中,则第一个项将被覆盖。据我所知,这种类型在.net中不存在,不,这和字典不一样。
|
|
|
billy · 从连接到键的哈希集中删除值? 8 年前 |
|
The Stompiest · 如何使用多线程使我的应用程序更快 8 年前 |
|
|
Eltorrooo · 为什么哈希集中的顺序从未改变?[副本] 8 年前 |
|
|
ItsMeGokul · HashSet-如何搜索 8 年前 |
|
|
James W. · 带有通配符的java黑名单 9 年前 |
|
|
Max.Futerman · 在MongoDB中序列化枚举的哈希集 9 年前 |