gpt4 book ai didi

c# - ConcurrentDictionary 多次添加相同的键

转载 作者:行者123 更新时间:2023-11-30 22:01:10 25 4
gpt4 key购买 nike

我想使用 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

最佳答案

您可以添加两个包含相同值的不同实例,因为您还没有覆盖 GetHashCode()Equals()。这会导致使用默认的相等比较,对于引用类型,它只是比较引用本身。在这种情况下,两个不同的实例始终被视为不同的值。

一个选择是使您的类型成为 struct 而不是 class。这使用将考虑字段值的默认比较。

或者,您可以继续覆盖 GetHashCode()Equals()。例如:

public class pKeys
{
public pKeys()
{ }
public pKeys(long sID, long pID)
{
this.seID = sID;
this.pgID = pID;

}
public readonly long seID;
public readonly long pgID;

public override int GetHashCode()
{
return seID.GetHashCode() * 37 + pgID.GetHashCode();
}

public override bool Equals(object other)
{
pKeys otherKeys = other as pKeys;

return otherKeys != null &&
this.seID == otherKeys.seID &&
this.pgID == otherKeys.pgID;
}
}

注意事项:

  • 哈希码是根据各个值的哈希码计算得出的。一个乘以37,这简直就是一个方便的质数;有些人更喜欢使用更大的质数来更好地“混合”。对于大多数情况,恕我直言,以上内容都可以正常工作。
  • 请注意,您提出的解决方案(将值转换为字符串、连接它们并返回其哈希码)有几个负面影响:
    • 您必须创建三个字符串实例才能生成哈希码!单是内存开销就够糟糕了,当然还有格式化这两个整数的成本。
    • 从字符串生成散列码的计算成本高于从整数值生成的哈希码
    • 发生冲突的风险要高得多,因为不同的值更容易产生相同的字符串(例如 (11, 2222) 和 (111, 222))
  • 我在您的字段中添加了readonly。如果您决定将类型设为 struct(即即使您不覆盖方法),这将是关键。但即使对于一个类,可相等的可变类型也是一个大问题,因为如果它们在添加到基于散列的集合后发生变化,则该集合实际上已被破坏。此处使用 readonly 可确保类型不可变。 (此外,应该避免使用恕我直言的公共(public)字段,但如果必须使用它们,即使您不重写相等方法,它们也绝对应该是readonly)。
  • 有些人更喜欢在 Equals() 方法中检查类型是否完全相等。事实上,这通常是个好主意……它简化了对象比较的场景,并使代码更易于维护。但为了举例,可分配性(即 as)更易于阅读,并且无论如何在许多情况下都是有效的。

参见 General advice and guidelines on how to properly override object.GetHashCode()以获得更多指导。

关于c# - ConcurrentDictionary 多次添加相同的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27995440/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com