在ToDictionary调用中捕获异常

时间:2013-01-27 19:11:28

标签: c# linq exception exception-handling dictionary

我有简单的LINQ语句,它拆分字符串,然后将值抛出到字典中。问题是很少字典已经具有相同值的现有密钥,因此抛出异常并且“dict”的值保持为空。

dict = lines.Select(l => l.Split('|')).ToDictionary(d => d[0], d => d[1]);

有没有办法修改LINQ语句,以便在插入字典之前检查字典是否已有密钥,或者捕获异常但是继续将其余值写入字典?我尝试在该行周围放置一个try块,它捕获异常但导致没有添加任何元素,因此字典保持为空。

3 个答案:

答案 0 :(得分:2)

请勿使用ToDictionary,而应使用常规foreach并测试密钥。

将查询从转换中断为字典。

var splits = lines.Select(l => l.Split('|'));

var dict = new Dictionary<string,string>();
foreach(var item in splits)
{
   if(!dict.ContainsKey(item[0]))
       dict.Add(item[0], item[1]);
}

答案 1 :(得分:2)

您可以随时使用GroupBy为每个键创建一个组,然后只选择字典的每个键的第一个值;

var dict = lines.Select(x => x.Split('|'))
                .GroupBy(x => x[0], x => x[1])
                .ToDictionary(x => x.Key, x => x.First());

答案 2 :(得分:0)

如果你需要为每个键保存一个值的字典,你可以使用它:

var dict1 = lines
          .Select(l => l.Split('|'))
          .GroupBy(s => s[0])
          .ToDictionary(d => d.Key, d => d.First()[1]);

或者您可以使用此功能,如果您希望Dictionary<string,IEnumerable<string>>将密钥和相应值保存为IEnumerable<string>

var dict2 = lines
           .Select(l => l.Split('|'))
           .GroupBy(s => s[0])
           .ToDictionary(d => d.Key, d => d.Select(r => r[1]));