2017-06-02 7 views
1

DITIONARYを1つの違いで拡張するカスタム型を定義しようとしています。C#キーが存在しない場合のセッター付きのカスタム辞書型

myCustomDic[3.5] = 4.0; 

最初にキー3.5が存在するかどうかを確認します。そうであれば、値を新しい値に設定します。それ以外の場合は、キーに新しい値を追加します。しかしtestDicに追加どのキーと値のペアが存在しない

var testDic = new Dic(new Dictionary<double, double>()); 
testDic[2.5] = 4.0; 

:私はこのようにそれをやった:

class Dic : Dictionary<double, double> 
    { 
     private readonly Dictionary<double, double> _property; 
     public Dic(Dictionary<double, double> property) 
     { 
      _property = property; 
     } 
     //Indexer: 
     public new double this[double CA] 
     { 
      get 
      { 
       return _property[CA]; 
      } 
      set 
      { 
       if (_property.ContainsKey(CA)) 
       { 
        _property[CA] = value; 
       } 
       else 
       { 
        _property.Add(CA, value); 
       } 
      } 
     } 
    } 

と私はこのようにそれを使うのか? 誰かが理由を教えてくれますか?

答えて

4

Dictionaryをサブクラス化しているため、独自のプライベート辞書も必要ありません。また、あなたはまったく独自のクラスを作成する必要はありませんので、あなたが記述行動は、Dictionaryはすでにどのように動作するかです:

var t2 = new Dictionary<double, double>(); 

t2[2.5] = 4.0; 
Console.WriteLine(t2[2.5]); // outputs 4 
t2[2.5] = 8.0; 
Console.WriteLine(t2[2.5]); // outputs 8 

Dictionary<TKey, TValue>.Item Property (TKey)のドキュメントから:

あなたは、プロパティ値を設定すると、そのキーがディクショナリにある場合、そのキーに関連付けられた値は、割り当てられた値に置き換えられます。キーがディクショナリにない場合は、キーと値がディクショナリに追加されます。

しかし、あなたがすることができます

class Dic : Dictionary<double, double> { 
    //Indexer: 
    public new double this[double CA] { 
     get => (this as Dictionary<double, double>)[CA]; 
     set { 
      var parent = this as Dictionary<double, double>; 
      if (parent.ContainsKey(CA)) 
       parent[CA] = value; 
      else 
       parent.Add(CA, value); 
     } 
    } 
} 

次に、あなたが行うことができます:あなたはそれを上書きしていなかったので、ゼロのままCountプロパティをチェックしているため

var testDic = new Dic(); 

testDic[2.5] = 4.0; 
Console.WriteLine(testDic[2.5]); // this outputs 4 
testDic[2.5] = 8.0; 
Console.WriteLine(testDic[2.5]); // this outputs 8 
0

です。

あなたの_propertyの数は増加しますが、外部のものは増加しません。

デバッガビジュアライザは引き続き0を報告する元のディクショナリカウントを呼び出しますが、コンソールに出力すると正しく動作します。

あなたの要件を説明する方法が既に辞書によって実装されているため、なぜ辞書から派生したのかまだ分かりません。

public TValue this[TKey key] 
{ 
    get 
    { 
     int num = this.FindEntry(key); 
     if (num >= 0) 
     { 
      return this.entries[num].value; 
     } 
     ThrowHelper.ThrowKeyNotFoundException(); 
     return default(TValue); 
    } 
    set 
    { 
     this.Insert(key, value, false); 
    } 
}