我有一个简单的LINQ语句,它拆分一个字符串,然后将值扔到字典中。问题是字典很少已经具有相同值的现有键,因此会抛出异常并且"dict"的值仍然为空。
dict = lines.Select(l => l.Split('|')).ToDictionary(d => d[0], d => d[1]);
有没有办法修改 LINQ 语句以在插入字典之前检查字典是否已具有密钥,或者捕获异常但继续将其余值写入字典?我尝试在该行周围放置一个 try 块,它捕获了异常,但导致没有添加任何元素,因此字典保持为空。
不要使用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]);
}
您始终可以使用GroupBy
为每个键创建一个组,然后只需选择字典中每个键的第一个值;
var dict = lines.Select(x => x.Split('|'))
.GroupBy(x => x[0], x => x[1])
.ToDictionary(x => x.Key, x => x.First());
如果你需要字典,每个键保存一个值,你可以使用这个:
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]));