【问题标题】:How to make a HashSet<HashSet<int>> work appropriately?如何使 HashSet<HashSet<int>> 正常工作?
【发布时间】:2018-07-06 10:17:10
【问题描述】:

我有一个程序,我在其中使用算法来确定对象的“索引”,以确定它是否是唯一对象,或者它是否真的与另一个类似对象持有相同的数据。

问题在于,由于创建此对象的方式,我不能依赖这些索引的顺序相同。

例如,带有索引的对象:

[0, 1, 2][0, 2, 1] 的对象相同。

为了处理这个问题,我一直把这些索引放到HashSet&lt;int&gt;中,希望以后我去比较集合时会很容易,因为在集合符号中,{0, 1, 2}是与{0, 2, 1} 相同。

问题是,我不能就这样走了

Object1.UniqueHashSet.equals(Object2.UniqueHashSet) 

因为我有很多这些对象要比较,而且我需要确定这些对象列表中有多少个唯一对象。

为了解决这个问题,我一直在尝试将这些结构添加到它们自己的HashSet&lt;HashSet&lt;int&gt;&gt; 中,这样最后我就可以返回 HashSet 中的元素数量。

当我将HashSet&lt;int&gt; 添加到具有值{0, 1, 2}HashSet&lt;HashSet&lt;int&gt;&gt; 中,然后将{0, 2, 1}HashSet&lt;int&gt; 添加到HashSet&lt;HashSet&lt;int&gt;&gt; 中,它会在集合中创建两个新元素,当我真的只想要一个。所以事实证明我有:{{0, 2, 1}, {0, 1, 2}},而我真正想要的是{{0, 2, 1}}

几个小时以来,我一直在绞尽脑汁想弄清楚如何做到这一点。有人可以指出我正确的方向吗?

【问题讨论】:

    标签: c# set hashset uniqueidentifier indices


    【解决方案1】:

    您需要创建一个继承的 HashSet 类。您需要覆盖以下方法:

    public override int GetHashCode() { /* Implementation */ }
    public override bool Equals(object obj) { /* Implementation */ }
    

    属性将基于集合的成员。

    那么,插入到自定义类的HashSet中就不会导致重复了。

    您将拥有如下结构:

    HashSet<MyHashSet<int>>
    

    GetHashCode 应该是基于集合中各个值的计算。 Equals 应该检查集合成员是否相等。

    以下是有关该主题的更多信息:

    How should I override Equals and GetHashCode for HashSet?

    【讨论】:

    • 我决定从 SortedSet 继承。如何编写一个好的 GetHashCode() 和 Equals() 覆盖,使得复杂性不是 O(n),其中 n 是 SortedSet 中的元素数。就我目前的 GetHashCode 复杂度(O(n))和 Equals 复杂度而言,复杂度太高了。
    • 如果它们已排序,您可以使用Enumerable.SequenceEqual(lhs, rhs) 进行比较。
    猜你喜欢
    • 1970-01-01
    • 2019-03-28
    • 2013-06-16
    • 2019-03-31
    • 2014-07-11
    • 1970-01-01
    • 2016-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多