当前位置:  开发笔记 > 编程语言 > 正文

是否有一个IDictionary实现,在缺少键时,返回默认值而不是抛出?

如何解决《是否有一个IDictionary实现,在缺少键时,返回默认值而不是抛出?》经验,为你挑选了3个好方法。

如果缺少键,则Index into Dictionary会引发异常.是否有IDictionary的实现,而是返回默认值(T)?

我知道"TryGetValue"方法,但这不可能与linq一起使用.

这会有效地做我需要的吗?:

myDict.FirstOrDefault(a => a.Key == someKeyKalue);

我认为它不会,因为我认为它将迭代键而不是使用哈希查找.



1> Jon Skeet..:

实际上,这根本不会有效.

你总是可以写一个扩展方法:

public static TValue GetValueOrDefault
    (this IDictionary dictionary, TKey key)
{
    TValue ret;
    // Ignore return value
    dictionary.TryGetValue(key, out ret);
    return ret;
}

或者使用C#7.1:

public static TValue GetValueOrDefault
    (this IDictionary dictionary, TKey key) =>
    dictionary.TryGetValue(key, out var ret) ? ret : default;

用途:

表达方法(C#6)

一个输出变量(C#7.0)

默认文字(C#7.1)


@PeterGluck:更紧凑但效率更低......为什么在键存在的情况下执行两次查找?
@JonSkeet:谢谢你纠正彼得; 我一直在使用那种"效率较低"的方法,但却没有意识到这一点.
非常好!我将无耻地剽窃 - 呃,岔开它.;)
显然,MS认为这足以添加到System.Collections.Generic.CollectionExtensions中,就像我刚刚尝试过的那样。
或更紧凑地说:`return(dictionary.ContainsKey(key))吗?dictionary [key]:default(TValue);`

2> nawfal..:

携带这些扩展方法可以帮助..

public static V GetValueOrDefault(this IDictionary dict, K key)
{
    return dict.GetValueOrDefault(key, default(V));
}

public static V GetValueOrDefault(this IDictionary dict, K key, V defVal)
{
    return dict.GetValueOrDefault(key, () => defVal);
}

public static V GetValueOrDefault(this IDictionary dict, K key, Func defValSelector)
{
    V value;
    return dict.TryGetValue(key, out value) ? value : defValSelector();
}


@nawfal好点.保持干燥比避免一个可怜的方法调用更重要.
最后的重载是有趣的.既然没有什么可以选择_from_,这只是一种懒惰的评价形式吗?

3> cdev..:

如果有人使用.net core 2及更高版本(C#7.X),则会引入CollectionExtensions类,并且如果字典中没有key,则可以使用GetValueOrDefault方法获取默认值。

Dictionary colorData = new  Dictionary();
string color = colorData.GetValueOrDefault("colorId", string.Empty);

推荐阅读
周扒pi
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有