我正在尝试创建一个继承自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
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
答案 0 :(得分: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;
}
}
答案 1 :(得分:-3)
应该是沿线的(在浏览器中编码,所以没有调试......) 不是真正的覆盖,但很容易实现...... 我稍后会尝试进入真正的覆盖
private string _Value;
public string GetValue(string KeyName, string sDefault)
{
if (_Value.Length == 0)
{
return sDefault;
}
else
{
return sDefault; ;
}
}