У меня есть Node class:
public class Node : INode
{
public object Value { get; set; }
}
И у меня есть EqualityComparer для этого класса Node:
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();
}
}
Я создаю свой HashSet , передавая NodeEqualityComparer.
У меня есть 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 в мой хэш-набор,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;
будет 2 элемента, которые равны друг другу (значение = 1) на основена NodeEqualityComparer.это n1 и n3.
ПОЧЕМУ хэш-сет не не запрещает обновление узла или удаление его