Mar*_*ijn 6 .net c# clr hashset
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();
}
}
Run Code Online (Sandbox Code Playgroud)
它很乐意操纵集合中的项目是相同的,只有在构建新的HashSet时才将它们过滤掉.当我想使用需要知道条目的集合时,什么是明智的?滚动我自己,Add(T item)从项目中添加副本,枚举器枚举所包含项目的副本?这提出了一个挑战,即每个包含的元素都应该是可深度复制的,至少在它影响它平等的项目中是这样.
另一个解决方案是推出自己的,并只接受执行INotifyPropertyChanged元素,并采取行动的情况下,重新检查平等,但是这似乎严重限制,更不用提了一大堆的工作和性能损失的引擎盖下.
我想到的另一个可能的解决方案是确保构造函数中的所有字段都是readonly或const.所有解决方案似乎都有很大的缺点.我还有其他选择吗?
你真的在谈论对象身份.如果您要哈希项目,他们需要具有某种身份,以便可以进行比较.
public int myint.它应该是readonly,并且只在构造函数中设置.这是Tester对象的问题,而不是集合.你需要认真思考如何定义身份.这不是一个容易的问题.
| 归档时间: |
|
| 查看次数: |
1169 次 |
| 最近记录: |