带有默认值的.net字典

时间:2010-11-02 16:30:24

标签: .net dictionary

我想要一个字典,它会为不在字典中的任何键返回指定值,如:

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");

6 个答案:

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