我有简单的LINQ语句,它拆分字符串,然后将值抛出到字典中。问题是很少字典已经具有相同值的现有密钥,因此抛出异常并且“dict”的值保持为空。
dict = lines.Select(l => l.Split('|')).ToDictionary(d => d[0], d => d[1]);
有没有办法修改LINQ语句,以便在插入字典之前检查字典是否已有密钥,或者捕获异常但是继续将其余值写入字典?我尝试在该行周围放置一个try块,它捕获异常但导致没有添加任何元素,因此字典保持为空。
答案 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]));