[c#] 字典返回一个默认值,如果该键不存在


Answers

我知道这是一个旧帖子,我喜欢使用扩展方法,但这里有一个简单的类,当我需要默认值时,我不时使用它来处理字典。

我希望这只是基础Dictionary类的一部分。

public class DictionaryWithDefault<TKey, TValue> : Dictionary<TKey, TValue>
{
  TValue _default;
  public TValue DefaultValue {
    get { return _default; }
    set { _default = value; }
  }
  public DictionaryWithDefault() : base() { }
  public DictionaryWithDefault(TValue defaultValue) : base() {
    _default = defaultValue;
  }
  public new TValue this[TKey key]
  {
    get { 
      TValue t;
      return base.TryGetValue(key, out t) ? t : _default;
    }
    set { base[key] = value; }
  }
}

但是要小心。 通过继承和使用new (因为override在本地Dictionary类型上不可用),如果DictionaryWithDefault对象被上传到普通Dictionary ,调用索引器将使用基本Dictionary实现(如果丢失则抛出异常)而不是子类的实现。

Question

这个问题在这里已经有了答案:

现在我发现自己在我的代码中经常使用当前模式

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>();
}

这两种方式都很迂回。 我真正想要的是类似的东西

dictionary.GetValueOrDefault(key)

现在,我可以为字典类编写一个扩展方法来为我做这件事,但我想我可能会错过已经存在的东西。 那么,有没有一种方法可以在不写入字典扩展方法的情况下以更简单的方式实现这一点?




不,没有这样的存在。 扩展方法是要走的路,你的名字( GetValueOrDefault )是一个不错的选择。






Links