我想要一个字典,它会为不在字典中的任何键返回指定值,如:
var dict = new DictWithDefValues("not specified");
dict.Add("bob78", "Smart");
dict.Add("jane17", "Doe");
Assert.AreEqual(dict["xxx"], "not specified");
扩展System.Collections.Generics.Dictionary并覆盖TryGetValue不起作用,因为TryGetValue不是虚拟的。
从头开始重新实现字典(来自IDictionary<,>)是太多的努力。
扩展方法不会让我用默认值“初始化”字典。我希望字典的消费者认为密钥存在,而不仅仅是dict.GetOrDefault(key, "not specified");
答案 0 :(得分:7)
从头开始重新实现字典(来自IDictionary<,>)是太费力了
这是最好的选择。只需将Dictionary<,>
封装为您的类的成员,并将所有成员传递给Dictionary的代码。在这种情况下,您只需要处理希望不同的属性和方法。
我同意这是一项繁琐的工作 - 但它的打字时间可能不到5分钟,因为每种方法都可以传递给内部字典的实现。
答案 1 :(得分:3)
我认为Reed是正确的,Reimplementing Dictionary很简单,如果这就是你需要的那么好。
但创建一个替换
的新类似乎有些过分 dict.TryGetValue("xxx", out value);
value = value ?? "not specified";
带
value = dict.GetOrDefault(key, "not specified")
答案 2 :(得分:1)
这种扩展方法让我完成了;
public static TValue GetValueOrDefault<TKey, TValue>(this Dictionary<TKey, TValue> source, TKey key, TValue defaultValue = default(TValue))
{
TValue found;
if (source.TryGetValue(key, out found))
{
return found;
}
else
{
return defaultValue;
}
}
这样称呼;
dict.GetValueOrDefault("foo", 0) // returns the key under "foo", or 0 if missing.
答案 3 :(得分:0)
我在.NET中创建了一个DefaultableDictionary,它完全符合您的要求!
http://github.com/jsonmez/Defaultable-Dictionary
博文here。
答案 4 :(得分:0)
试试这个
public class DefaultDictionary<Tkey,Tvalue>
where Tkey: IEquatable<Tkey>
{
private readonly Func<Tvalue> _getDefault;
private Dictionary<Tkey, Tvalue> _dict;
public DefaultDictionary(Func<Tvalue> getDefault = null)
{
if (getDefault == null)
{
_getDefault = () => default(Tvalue);
}
else
{
_getDefault = getDefault;
}
_dict = new Dictionary<Tkey, Tvalue>();
}
public Tvalue this[Tkey key]
{
get
{
if (!_dict.ContainsKey(key))
{
_dict[key] = _getDefault();
}
return _dict[key];
}
set { _dict[key] = value; }
}
public bool ContainsKey(Tkey key)
{
return _dict.ContainsKey(key);
}
public override string ToString()
{
var sb = new StringBuilder();
foreach (var kvp in _dict)
{
sb.AppendFormat("[{0}] : {1}", kvp.Key.ToString(), kvp.Value.ToString()).AppendLine();
}
return sb.ToString();
}
}
您可以根据需要轻松地将包装器添加到其他方法和属性中。
答案 5 :(得分:0)
我注意到你的例子是一个字符串字典。它也是我自己场景中的字符串,我想要类似的行为。
也许好的旧StringDictionary
课会做你想要的。与Dictionary<string,string>
不同,它的get_Item方法为字典中不存在的键返回null
。