2016-03-31 8 views
0

辞書のキーとして格納されるサブクラスでIEqualityComparerを実装しようとしています。IEqualityComparerディクショナリのサブクラスを呼び出さない

次は私が

public class SuperClass : IEqualityComparer<SuperClass> { 

    public virtual bool Equals(SuperClass dictKeyComparerA, SuperClass dictKeyComparerB) { 
     throw new NotImplementedException(); 
    } 

    public virtual int GetHashCode(SuperClass dictKeyComparer) { 
     throw new NotImplementedException();  
    } 
} 

public class SubClass : SuperClass { 

    private readonly string application; 

    public SubClass(string application) { 
     this.application = application; 
    } 

    public override bool Equals(SuperClass dictKeyComparerA, SuperClass dictKeyComparerB) { 
     throw new NotImplementedException(); 
    } 

    public override int GetHashCode(SuperClass dictKeyComparer) { 
     throw new NotImplementedException();  
    } 
} 

と私は辞書を検索しようとするには、以下のいる持っているものです。

Dictionary<SubClass, List<string>> TestDict3 = new Dictionary<SubClass, List<string>>(new SubClass("random")); 

    var testKeyb = new SubClass("12345"); 
    var testListb = new List<string>{"aaaaa"}; 

    TestDict3.Add(testKeyb, testListb); 

    var testKey2b = new SubClass("12345"); 
    var testKey3b = new SubClass("56973"); 

    if(TestDict3.ContainsKey(testKey2b)) { 
     Console.WriteLine("found testKey2b"); 
    } 
    else { 
     Console.WriteLine("did not found testKey2b"); 
    } 

    if(TestDict3.ContainsKey(testKey3b)) { 
     Console.WriteLine("found testKey3b"); 
    } 
    else { 
     Console.WriteLine("did not found testKey3b"); 
    } 

コードが実行されると、それはそれので、実装されていない例外を返しますオーバーライド関数の代わりにスーパークラスGetHashCode関数を呼び出しています。

問題に関するご意見はありますか?

+5

あなたの例では、スーパークラスとサブクラスの両方が実装されていない例外をスローします –

答えて

0

Hmmmmm、 - すべての機能を呼び出す:

throw new NotImplementedException(); 

彼らはNotImplementedExceptionをスロー理由である...

私は、サブクラス実装でいくつかの賢明なコードを試してみました、それが動作します。

public override bool Equals(SuperClass dictKeyComparerA, SuperClass dictKeyComparerB) 
{ 
    var a = dictKeyComparerA as SubClass; 
    var b = dictKeyComparerB as SubClass; 
    return a.application == b.application; 
} 

public override int GetHashCode(SuperClass dictKeyComparer) 
{ 
    return application.GetHashCode(); 
} 
関連する問題