2

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

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

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

4

3 回答 3

4

不要使用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]);
}
于 2013-01-27T19:14:28.930 回答
3

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

var dict = lines.Select(x => x.Split('|'))
                .GroupBy(x => x[0], x => x[1])
                .ToDictionary(x => x.Key, x => x.First());
于 2013-01-27T19:33:45.907 回答
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]));
于 2013-01-27T19:22:04.317 回答