【发布时间】:2018-06-08 17:24:16
【问题描述】:
在这种情况下,一个成员被编辑为与另一个成员相等,强制 HashSet 重新计算哈希从而清除重复项的正确方法是什么?
我知道不要期望这会自动发生,所以我尝试了诸如将 HashSet 与自身相交,然后将其重新分配给引用自身和相同 EqualityComparer 的构造函数调用。我认为后者肯定会起作用,但没有。
确实成功的一件事是将 HashSet 从其转换为其他容器类型(如 List)重构,而不是直接从其自身重构。
类定义:
public class Test {
public int N;
public override string ToString() { return this.N.ToString(); }
}
public class TestClassEquality: IEqualityComparer<Test> {
public bool Equals(Test x, Test y) { return x.N == y.N; }
public int GetHashCode(Test obj) { return obj.N.GetHashCode(); }
}
测试代码:
TestClassEquality eq = new TestClassEquality();
HashSet<Test> hs = new HashSet<Test>(eq);
Test a = new Test { N = 1 }, b = new Test { N = 2 };
hs.Add(a);
hs.Add(b);
b.N = 1;
string fmt = "Count = {0}; Values = {1}";
Console.WriteLine(fmt, hs.Count, string.Join(",", hs));
hs.IntersectWith(hs);
Console.WriteLine(fmt, hs.Count, string.Join(",", hs));
hs = new HashSet<Test>(hs, eq);
Console.WriteLine(fmt, hs.Count, string.Join(",", hs));
hs = new HashSet<Test>(new List<Test>(hs), eq);
Console.WriteLine(fmt, hs.Count, string.Join(",", hs));
输出:
"Count: 2; Values: 1,1"
"Count: 2; Values: 1,1"
"Count: 2; Values: 1,1"
"Count: 1; Values: 1"
基于最终方法的成功,我可能会创建一个扩展方法,其中 HashSet 将自身转储到本地列表中,清除自身,然后从所述列表中重新填充。
这真的有必要吗,还是有一些更简单的方法可以做到这一点?
【问题讨论】:
-
这里的问题是你正在做一些明确不应该发生的事情,用于散列和字典的键必须不改变。因此,没有人可以轻松处理这种情况。
标签: c# hashset iequalitycomparer