在 If 条件语句中执行 TryGetValue 并评估其值。

10
有没有一种方法可以在If条件语句中将TryGetValue写在一行上。一般调用TryGetValue的方式是:
string value;
Dictionary.TryGetValue("Key", out value);
If(value == "condition") { ... }

我需要的是类似于这样的内容。
If(Dictionary.TryGetValue("Key", out string) == "Condition") { ... }

我知道这条代码行不起作用,但它展示了期望的结果。

有没有任何方法可以实现这个效果?

1个回答

15
你需要先使用返回的bool,然后可以使用out参数(自C# 7起):

你需要先使用返回的bool,然后可以使用out参数(自C# 7起):

if (Dictionary.TryGetValue("Key", out string value) && value == "Condition")
{
    //...
}

微软开发网络文档:

从 C# 7.0 开始,你可以在方法调用的参数列表中声明 out 变量,而不是在单独的变量声明中。

如果你没有使用 C#7 或者想让代码更加简洁,可以使用这个扩展:

public static bool TryEvaluateValue<TKey, TValue>(this IDictionary<TKey, TValue> dict, TKey key, Func<TValue, bool> evalValue)
{
    TValue val;
    if(!dict.TryGetValue(key, out val))
        return false;
    return evalValue(val);
}

那么你的if条件会变成:

if (Dictionary.TryEvaluateValue("Key", value => value == "Condition"))
{
    //...
}

允许在IDictionary上使用扩展方法,在参数为null时返回false(而不是直接抛出NRE)是一个可疑的想法;这可能会隐藏错误并使分析变得复杂(“我知道它不是null,因为它在这一行工作了!”)。有一些扩展方法允许使用null(主要是转换),但这可能不是其中之一。 - Jeroen Mostert
@JeroenMostert:你是对的,已经移除了空值检查。 - Tim Schmelter

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