【问题标题】:Compact dictionary key lookup紧凑的字典键查找
【发布时间】:2012-07-08 03:40:40
【问题描述】:

有没有办法写得更紧凑?

return _searchRedirectionMap.ContainsKey(query) ? _searchRedirectionMap[query] : "";

假设_searchRedirectionMap 被定义为IDictionary<string,string>

【问题讨论】:

标签: c#


【解决方案1】:

您可以使用TryGetValue 方法,但它会为string 类型返回null:

_searchRedirectionMap.TryGetValue(key, out value);

文档:MSDN

【讨论】:

  • 如果密钥不存在则不返回null,而是不修改out参数
  • @PhilipDaubmeier 错误,它返回给定类型的默认值,即null for string。检查我的答案中的链接
  • @PhilipDaubmeier 它确实返回nullvalue = default(TValue),所以nullstring),因为在方法返回之前必须为out参数赋值。
  • 哦,对了...真丢脸,我把 outref 参数混淆了
【解决方案2】:

您可以在 IDictionary 上编写一个利用 TryGetValue 方法的扩展方法:

public static TValue GetValueOrDefault<TKey, TValue>(this IDictionary<TKey, TValue> source, TKey key, TValue defaultValue)
{
    TValue outValue;
    if (source.TryGetValue(key, outValue))
    {
        return outValue;
    }

    return defaultValue;
}

然后你可以像这样使用它:

return _searchRedirectionMap.GetValueOrDefault(query, string.Empty);

【讨论】:

  • IDictionary&lt;TKey, TValue&gt; 中没有定义这样的东西真的很遗憾,因为这会使一些 if-else-constructs 过时。在大多数情况下,这反过来又使代码更具可读性...
  • 嗯,这有点具体(在我的脑海中,我想不出我的项目中的代码如果不在字典中会使用默认值;通常如果它不在那里,我需要做一些完全不同的事情)并且有它的性能缺点,因为即使字典确实包含密钥,也必须获取/执行/解决 defaultValue 并将其传递到方法中。但这就是扩展方法的用途:如果您需要这种方法,因为您经常使用它?没问题!我只是认为它应该在 BCL 中是有争议的。
  • @ChrisSinclair 实际上,一个相当有用的模式是一个字典,它在第一次访问时为丢失的键插入一个默认值,这避免了不必要地重新创建默认值。 (例如,进行频率计数。)不确定是否有理由将此放在 BCL 中,但为了一个健全的 API,您需要一个单独的类而不是扩展。跨度>
  • @millimoose:我认为这是可行的,也许如果您提供一个固定值作为构造函数的一部分。但是,获取一个值一个默认值(不将该值插入该键)然后在消费代码中频繁使用它的方法似乎有点过于特定于上下文对我来说。
猜你喜欢
  • 2011-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多