我发现自己如今在我的代码中经常使用当前模式
var dictionary = new Dictionary<type, IList<othertype>>(); // Add stuff to dictionary var somethingElse = dictionary.ContainsKey(key) ? dictionary[key] : new List<othertype>(); // Do work with the somethingelse variable
有时
var dictionary = new Dictionary<type, IList<othertype>>(); // Add stuff to dictionary IList<othertype> somethingElse; if(!dictionary.TryGetValue(key, out somethingElse) { somethingElse = new List<othertype>(); }
这两种方式都感觉很round回。我真正想要的是
dictionary.GetValueOrDefault(key)
现在,我可以为字典类编写一个扩展方法,该方法可以为我完成此任务,但我发现可能会丢失一些已经存在的东西。因此,有没有一种方法可以更轻松地执行此操作,而无需编写字典的扩展方法?
TryGetValue 已经为字典指定了类型的默认值,因此您可以使用:
TryGetValue
dictionary.TryGetValue(key, out value);
并忽略返回值。然而,真正 将 刚刚返回default(TValue),而不是一些自定义的默认值(也没有,更有效,执行委托的结果)。框架中没有比它更强大的功能了。我建议两种扩展方法:
default(TValue)
public static TValue GetValueOrDefault<TKey, TValue> (this IDictionary<TKey, TValue> dictionary, TKey key, TValue defaultValue) { TValue value; return dictionary.TryGetValue(key, out value) ? value : defaultValue; } public static TValue GetValueOrDefault<TKey, TValue> (this IDictionary<TKey, TValue> dictionary, TKey key, Func<TValue> defaultValueProvider) { TValue value; return dictionary.TryGetValue(key, out value) ? value : defaultValueProvider(); }
(当然,您可能需要检查参数:)