2014-04-15 31 views
0

我正在使用自定义类作为字典(TKey,TValue)的关键字。该类重写GetHashCode和Equals等。有没有办法使用等效键检索Dictionary键?

我希望能够做的是添加一个键/值对;之后,生成一个等于第一个密钥的新密钥(相同的哈希码,Equals返回true),并且使用此等效密钥不仅可以检索该值,而且还可以检索对第一个已添加的原始密钥的引用到词典。

例子:

var keyA = new KeyClass("abc123"); 
var keyB = new KeyClass("abc123"); // same as far as dictionary is concerned 

var dict = new Dictionary<KeyClass, Object>(); 

dict.Add(keyA, value); 

现在我怎样才能使用KEYB从字典到科亚参考?

这似乎应该很容易做到没有枚举Keys集合,因为Dictionary已经将这些键哈希化了,但是我找不到任何构建到Dictionary类中的东西。我错过了什么吗?现在,我将不得不使用双向字典并进行反向查找,或者(在本例中为我的首选项)“增强”我用于值的类,以便它们存储对原始键的引用。

+1

当“类重写的GetHashCode和平等相待,等” - 怎么可能出问题? ;) –

+0

我不确定你想要达到什么目的?为什么列举键是不够的? –

+0

@MitchWheat在类中实现'IEquatable'时,需要重写这些方法。 http://msdn.microsoft.com/en-us/library/ms131190(v=vs.110).aspx – Smeegs

回答

1

嘛,@ AD.Net是恰当的答案其中大部分是真正覆盖GetHashCode()Equals()

public class KeyClass 
{ 

    public readonly string key; 

    public KeyClass(string key) 
    { 
     this.key = key; 
    } 

    public override bool Equals(object other) 
    { 
     if (other == null) 
     return false; 

     // Casting object other to type KeyClass 
     KeyClass obj = other as KeyClass; 
     if (obj == null) 
     return false; 

     return this.key == other.key; 
    } 

    public override int GetHashCode() 
    { 
     return this.key.GetHashCode(); 
    } 
} 
+0

如果'other'不能转换为'KeyClass',那么不会抛出异常吗?也许'KeyClass obj = other作为KeyClass;'在这里更合适。 (当然,之后检查'null'是必须的)。 – Corak

+0

@Corak是的,我尽可能快地回答,非常抱歉。如果'KeyClass obj =(KeyClass)obj'会引发'InvalidCastException',我知道 –

+0

我不确定你在这里告诉我什么 - 我没有试图设计KeyClass,我试图获取最初添加到字典中的KeyClass实例的引用。 – Rich

相关问题