字典并获得一种价值

时间:2012-10-02 11:10:19

标签: c# dictionary

我有一个包含类似Dictionary<int, Queue<string>> dict之类的类,然后我使用TryGetValue

Queue<string> value;
if (!dict.TryGetValue(3, out value))
    throw new MyException("...");

是否有一个选项不显式定义值类型,基本上是为了避免键入的双重性?在C ++ STL容器中,有一个值typedef value_type可以在这种情况下使用,但我似乎无法在C#中找到类似的功能。谢谢。

4 个答案:

答案 0 :(得分:2)

如果你自己定义了一个很好的帮助方法,你可以结束类型规范:

public static class Utility
{
    public static TValue GetValueOrDefault<TKey,TValue>(
        this Dictionary<TKey, TValue> dictionary, 
        TKey key, 
        TValue @default = default(TValue))
    {
        TValue value;
        return dictionary.TryGetValue(key, out value)
                   ? value
                   : @default;
    }
}

请注意,我们仍然必须明确键入将由TryGetValue填充的值,但您可以从调用者中输入:

var value = dict.GetValueOrDefault(3);    // implicitly typed
if (value == null)
    throw new MyException("...");

请注意,如果null在此上下文中是有效值,则需要其他内容,但可以应用相同的原则 - 使用编译器可以推断通用方法的类型来构建帮助程序的事实隐藏显式输入的方法。

答案 1 :(得分:1)

您可以将片段重新编写为

if (!dict.ContainsKey(3))
    throw new MyException("...");
var value = dict[3];

或者,从AakashM的答案中无耻地窃取和改编,您可以编写自己的扩展方法来交换TryGetValue参数:

public static V ValueGetTry<K, V>(this Dictionary<K, V> d, K k, out bool found)
{
    V v;
    found = d.TryGetValue(k, out v);
    return v;
}

称为

bool found;
var val = dict.ValueGetTry(3, out found);
if (!found)
    throw new MyException("...");

这应该适用于任何类型的参数,并且只查询字典一次。

答案 2 :(得分:1)

没有。如果您执行ContainsKey并将索引编入字典,则可以使用隐式类型变量,如:

var key = 3;
if (!dict.ContainsKey(key)) {
    throw new ...;
}

var value = dict[key];

当然,效率会略低一些。但是varTryGetValue无关。

答案 3 :(得分:0)

现在,在C#7.0中,可以使用内联out变量

if (!dict.TryGetValue(3, out var value))
    throw new MyException("...");

请参见https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-7#out-variables