字典和获取值的类型问题

3

我有一个类,其中包含这样的内容 Dictionary<int, Queue<string>> dict 然后我使用 TryGetValue:

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

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


输出value,顺便说一下。而且,没有这样的功能,C#无法进行类型别名。 - nothrow
4个回答

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是一个有效值,则需要其他内容,但同样的原则可以应用 - 利用编译器可以推断泛型方法类型的事实来构建一个帮助方法以隐藏显式类型。

默认检查仍需要根据参数类型进行更改——例如,int为零等。您可以使用“out bool”参数(即将TryGetValue的返回值与出值交换)而不是默认值。 - Rawling

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

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


1
不行。如果你使用了ContainsKey并索引到字典中,你可以使用隐式类型变量,例如:
var key = 3;
if (!dict.ContainsKey(key)) {
    throw new ...;
}

var value = dict[key];

当然,这样会稍微低效一些。但是使用 TryGetValue 没有使用 var 的选项。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接