【发布时间】:2018-12-07 17:39:54
【问题描述】:
我有一个 Node 类:
public class Node : INode
{
public object Value { get; set; }
}
对于这个 Node 类,我有 EqualityComparer,如下所示:
public class INodeEqualityComparer : EqualityComparer<INode>
{
private INodeEqualityComparer()
{
}
private static readonly INodeEqualityComparer _instance =
new INodeEqualityComparer();
public static INodeEqualityComparer Instance
{
get { return _instance; }
}
public override bool Equals(INode x, INode y)
{
return (int)(x.Value) == (int)(y.Value);
}
public override int GetHashCode(INode obj)
{
return ((int)(obj.Value)).GetHashCode();
}
}
我通过传递 NodeEqualityComparer 创建我的 HashSet。
我有 4 个节点实例:
Node n1 = new Node(1);
Node n2 = new Node(2);
Node n3 = new Node(3);
Node n4 = new Node(1);
当我将 n1,n2,n3,n4 添加到我的 hashset 时,n4 会被忽略。
HashSet<INode> nodes = new HashSet<INode>(INodeEqualityComparer.Instance);
nodes.Add(n1);
nodes.Add(n2);
nodes.Add(n3);
nodes.Add(n4);
但是在我使用这个改变之后:
nodes.Where(n => (int)(n.Value) == 3).FirstOrDefault().Value = 1;
基于 NodeEqualityComparer 将有 2 个元素相等(值=1)。它们是 n1 和 n3。
为什么哈希集不阻止更新节点或删除它?
【问题讨论】:
-
能否给出完整代码?
-
考虑使用
T而不是object以避免装箱并提供类型安全。 -
您希望
HashSet如何防止消费者改变集合中的元素?你能编写自己的集合,不允许其中的项目发生变异吗? -
HashSet 怎么会知道你的某些代码改变了存储在 HashSet 中的对象的字段/属性? HashSet 只是一个集合,它不是某种“霸王”,随时随地监视您的代码在做什么......
标签: c# hashset equality iequalitycomparer