C# - 重构词典助手

时间:2017-11-01 17:28:29

标签: c# dictionary refactoring

我有以下帮助器来检查字典键是否存在。这适用于字符串字符串类型字典

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>

1 个答案:

答案 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,编译器将使用适合的任何一个。