C#中的“详细词典”,“覆盖新”这个[]或实现IDictionary

时间:2010-04-27 05:33:48

标签: c# dictionary coding-style

我想要的只是一本字典,它告诉我找不到哪个键,而不只是说The given key was not present in the dictionary

我简单地考虑过使用override new this[TKey key]做一个子类,但觉得它有点hacky,所以我已经实现了IDictionary接口,并将所有内容直接传递给内部Dictionary,只有其他逻辑在索引器中:

public TValue this[TKey key]
{
    get
    {
        ThrowIfKeyNotFound(key);
        return _dic[key];
    }
    set
    {
        ThrowIfKeyNotFound(key);
        _dic[key] = value;
    }
}
private void ThrowIfKeyNotFound(TKey key)
{
    if(!_dic.ContainsKey(key))
        throw new ArgumentOutOfRangeException("Can't find key [" + key + "] in dictionary");
}

这是正确/唯一的方法吗?会不会对这个[]真的那么糟糕?

3 个答案:

答案 0 :(得分:10)

听起来非常适合扩展方法:

public static class SomeUtilClass {
    public static TValue VerboseGetValue<TKey, TValue>(
        this IDictionary<TKey, TValue> data, TKey key)
    {
        TValue result;
        if (!data.TryGetValue(key, out result)) {
            throw new KeyNotFoundException(
                "Key not found: " + Convert.ToString(key));
        }
        return result;
    }
}

每当您致电VerboseGetValue时,这将适用于您现有的所有词典,例如:

    var data = new Dictionary<int, string> { { 123, "abc" } };
    Console.WriteLine(data.VerboseGetValue(123));
    Console.WriteLine(data.VerboseGetValue(456));

答案 1 :(得分:3)

在触摸基础字典之前,不要进行ContainsKey并检查是否存在密钥,为什么不这样做

get {
    try {
        return _dic[key];
    }
    catch (ArgumentOutOfRangeException) {
        throw new ArgumentOutOfRangeException(......);
    }
}

这样,你只需支付失败案例中的额外检查 - 成功案例,希望更常见,不必进行额外的字典查找。这对get来说很有用,但set更难,因为set的默认行为始终有效。如果您不想这样,那么您需要首先检查密钥是否存在。

答案 2 :(得分:1)

如果你想这样做,你将不得不以这种或那种方式推销自己。但我会问你为什么要这样做?