【问题标题】:Catching exception in ToDictionary call在 ToDictionary 调用中捕获异常
【发布时间】:2013-01-27 19:11:27
【问题描述】:

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

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

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

【问题讨论】:

  • 字典确实已经有了密钥。字典是由 Todictionary 调用创建的。源数据有重复。

标签: c# linq exception exception-handling dictionary


【解决方案1】:

不要使用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]);
}

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      或者你可以使用这个,如果你想要Dictionary&lt;string,IEnumerable&lt;string&gt;&gt;,它将键和对应的值保存为IEnumerable&lt;string&gt;

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-04-26
        • 1970-01-01
        • 1970-01-01
        • 2011-03-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多