3

我正在尝试创建一个从 Dictionary 继承的类。

例如:

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

然后我可以调用 retDict["test"] 来获取带有“test”键的项目。

我想要做的是在 retDict 上有一个我这样调用的方法。retDict["test","默认返回值"];

如果找不到密钥,我希望此方法在基本字典中创建一个项目。

这可能吗?如果可能的话,我该如何编写这个方法/“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

如果你想创建一个自定义类,当然可以通过indexer处理:

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 回答