下面是我的字典定义的一个示例。当我将DicKeys定义为class时,ContainsKey()无法工作。如果我将DicKeys更改为struct,它将正常工作。
为什么ContainsKey()在class和struct上的工作方式不同
Dictionary<DicKeys, DicVals> aDic = new Dictionary<DicKeys, DicVals>();
// original version as below
public Class DicKeys
{
public EnKey1 DicKeyItem1,
public EnKey2 DicKeyItem2,
}
// revised version as below
public struct DicKeys
{
public EnKey1 DicKeyItem1,
public EnKey2 DicKeyItem2,
}
// common parts of code below
public enum EnKey1
{
A1,
A2,
}
public enum EnKey2
{
B11,
B12,
}
DicKeys aDicKey = new DicKeys();
// assigned value to aDicKey obj here;
if (aDic.ContainsKey(aDicKey ) == true)
{
// do some thing here
// If I defined as 'class', it doesn't hit here.
// Updated to 'struct', it hit here.
}发布于 2010-12-14 17:50:45
那么,您还没有显示您正在填充字典的位置,或者sfTKey是什么……但我强烈怀疑这是因为您还没有覆盖DicKeys中的Equals或GetHashCode。
默认情况下,类使用引用标识来表示相等-换句话说,只有当两个键引用引用完全相同的对象时,它们才会进行相等比较。但是,您可以覆盖Equals和GetHashCode以提供基于对象内容的等价性。值类型(结构)自动使用基于值的相等性,但我当然不建议使用像这里这样的可变结构。(老实说,我根本不推荐使用公共字段。)
有关您可能在Equals和GetHashCode中执行的操作的示例,请参阅this question,以及您可能希望在具有基于值的相等的类型上提供的其他一些成员。
https://stackoverflow.com/questions/4437827
复制相似问题