【发布时间】:2015-01-17 02:00:48
【问题描述】:
我想用ConcurrentDictionary来检查这个数据键之前是否已经添加过,但是看起来我仍然可以添加之前添加的键。
代码:
public class pKeys
{
public pKeys()
{ }
public pKeys(long sID, long pID)
{
this.seID = sID;
this.pgID = pID;
}
public long seID;
public long pgID;
}
public static ConcurrentDictionary<pKeys, bool> existenceDic
= new ConcurrentDictionary<pKeys, bool>();
测试代码:
pKeys temKey = new pKeys(111, 222);
bool res = existenceDic.TryAdd(temKey, true);
Console.WriteLine(res);
temKey = new pKeys(111, 222);
res = existenceDic.TryAdd(temKey, true);
Console.WriteLine(res);
结果:
true
true
【问题讨论】:
-
您的
pKeys对象不会覆盖GetHashCode()或Equals(),因此这两个不同的实例被视为不同的值。要么使用同一个实例两次(而不是第二次调用new),要么正确覆盖这些方法,以便包含相同值的不同实例被认为是相同的值。 -
也许很容易解决,我只需将两个元素键转换为字符串,然后像哈希一样工作......
-
不,不要那样做。如果你这样做,那么 (11, 1222) 的值将与 (111, 222) 的值具有相同的哈希码,这没有任何理由。碰撞不是致命的,但您应该设计哈希码实现,至少尽量避免它们。
-
好吧,我在做"111"+"="+"222"
-
"111"+"="+"222"仍然是错误的。它仅解决了我用该特定方法指出的三个具体问题之一(坦率地说,是最不重要的一个)。
标签: c# dictionary concurrency parallel-processing concurrentdictionary