3

Dictionary から継承するクラスを作成しようとしています。

例えば:

var retDict = new Dictionary<string,string>();

次に、retDict["test"] を呼び出して、キー "test" を持つ項目を取得できます。

私がやりたいことは、このように呼び出す retDict のメソッドを持つことです。retDict["テスト","デフォルトの戻り値"];

キーが見つからない場合は、このメソッドでベース ディクショナリにアイテムを作成する必要があります。

これは可能ですか?可能であれば、このメソッド/「peroperty get」をどのように記述しますか?

よろしくお願いします。/デニス

[編集]

これがVB.NETの書き方です。

Public Class MyDictionary Inherits System.Collections.Generic.Dictionary(Of String, String)

Default Public Overloads Property Item(ByVal key As String, Optional DefaultValue As String = "") As String
    Get
        If Not MyBase.ContainsKey(key) Then
            If DefaultValue <> "" Then
                MyBase.Add(key, DefaultValue)
            Else
                Return ""
            End If
        End If
        Return MyBase.Item(key)
    End Get
    Set(ByVal value As String)
        MyBase.Item(key) = value
    End Set
End Property

End Class

4

2 に答える 2

1

Dictionary基本クラス ライブラリのクラスはこれを直接提供しません。ConcurrentDictionary<T,U>この機能を提供するメソッドを提供する代わりに使用するGetOrAddか、拡張メソッドを介して独自に実装することができます。

public static U GetOrAdd<T,U>(this Dictionary<T,U> dict, T key, U value)
{
    U val;
    if (dict.TryGetValue(key, out val))
         return val;

    dict[key] = value;
    return value;
}

これは、あなたが説明したようには動作しません-代わりに、次のようにします:

var val = retDict.GetOrAdd("test", "the default value");

このアプローチの利点は、カスタム クラス (拡張メソッドのみ) を作成する必要がなく、BCL API (つまり: ConcurrentDictionary<T,U>.GetOrAdd) と一致することです。

カスタム クラスを作成する場合は、もちろんインデクサーを介して処理できます。

public TValue this[TKey key, TValue defaultValue]
{
    get
    {
        TValue val;
        if (this.TryGetValue(key, out val))
             return val;

        this[key] = defaultValue;
        return defaultValue;
    }
}
于 2013-10-28T22:18:33.847 に答える
-3

(ブラウザでコーディングするため、デバッグされていません...)の行に沿ったものでなければなりません。実際にはオーバーライドではありませんが、実装するのに十分簡単です...後で真のオーバーライドに変更してみます

 private string _Value;
    public string GetValue(string KeyName, string sDefault)
    {

        if (_Value.Length == 0)
        {
            return sDefault;
        }
        else
        {
            return sDefault; ;
        }
    }
于 2013-10-28T22:21:21.187 に答える