我有以下帮助器来检查字典键是否存在。这适用于字符串字符串类型字典
var myDictionary = new Dictionary<string, string>();
myDictionary.GetValue("FirstName");
public static TU GetValue<T, TU>(this Dictionary<T, TU> dict, T key) where TU : class
{
TU val;
dict.TryGetValue(key, out val);
return val;
}
如何重构它,以便如果我有一个带有列表的字典,我想检查密钥是否存在,如果有,则获取列表中的第一项,例如:
var myDictionary = new Dictionary<string, List<string>>();
//populate the dictionary...
// Call to get first item from dictionary using key
myDictionary.GetValue("FirstName")[0]
我想在剃须刀中使用它如下:
<span >@myDictionary.GetValue("FirstName")[0]</span>
答案 0 :(得分:1)
您对错误消息原因的假设不正确:问题不在于您从List<string>
返回GetValue
,问题是您尝试索引空值找不到密钥时返回。
您需要验证结果是否为空:
<span>@(myDictionary.GetValue("FirstName") != null ? myDictionary.GetValue("FirstName")[0] : null)</span>
在这种情况下,原始函数似乎更有用:
<span>@(myDictionary.TryGetValue("FirstName", out var val) ? val[0] : null)</span>
您可以修改函数以返回空集合,但随后会出现索引超出范围错误。我看不到合理的返回对象,允许您按任意值索引而不会出错。否则你必须创建第二个函数来处理索引类型,这会引导你到另一个答案(我看到它被删除所以放在这里):
public static TU GetFirstValue<T, TU>(this Dictionary<T, IEnumerable<TU>> dict, T key) {
IEnumerable<TU> val;
dict.TryGetValue(key, out val);
return (val == null ? default(TU) : val.First());
}
您也可以将原始函数重命名为GetFirstValue,编译器将使用适合的任何一个。