当工作HashSets
在C#中,我最近碰到一个恼人的问题: HashSets
不保证内容的唯一性; 他们不是集。 他们做什么保证的是,当Add(T item)
被称为项目,如果没有在任何一组产品加入item.equals(that)
是true
。 如果你已经在集合操作项目这个拥有不再。 一个小程序,演示了(从我Linqpad copypasta):
void Main()
{
HashSet<Tester> testset = new HashSet<Tester>();
testset.Add(new Tester(1));
testset.Add(new Tester(2));
foreach(Tester tester in testset){
tester.Dump();
}
foreach(Tester tester in testset){
tester.myint = 3;
}
foreach(Tester tester in testset){
tester.Dump();
}
HashSet<Tester> secondhashset = new HashSet<Tester>(testset);
foreach(Tester tester in secondhashset){
tester.Dump();
}
}
class Tester{
public int myint;
public Tester(int i){
this.myint = i;
}
public override bool Equals(object o){
if (o== null) return false;
Tester that = o as Tester;
if (that == null) return false;
return (this.myint == that.myint);
}
public override int GetHashCode(){
return this.myint;
}
public override string ToString(){
return this.myint.ToString();
}
}
它会高兴地操纵集合中的项是相等的,只是过滤出来时,一个新的HashSet建成。 什么是advicible当我想带套,我需要知道的条目是唯一的工作吗? 推出自己的,其中添加(T项目)增加了一个副本掉的项目,枚举枚举,并通过包含项目的副本? 这就提出每个包含的元素应该是深拷贝,但至少在其项目影响是平等的挑战。
另一个解决方案是推出自己的,并只接受执行INotifyPropertyChanged元素,并采取行动的情况下,重新检查平等,但是这似乎严重限制,更不用提了一大堆的工作和性能损失的引擎盖下。
另一种可能的解决方案我想到的是确保所有字段都是只读或const在构造函数中。 所有的解决方案似乎有非常大的缺点。 我还有别的选择吗?