【问题标题】:Dictionary has duplicate keys in c# with toDictionary字典在 c# 中有重复的键与 toDictionary
【发布时间】:2020-03-08 05:22:45
【问题描述】:

我正在尝试使用 list.District() 和 toDictionary 从列表中消除重复的字符串,但它不起作用。

有什么建议可以用 Linq 消除重复代码吗?

这是我的代码

    [JsonIgnore]
    public Dictionary<string, int> SensorValues => InOrderSensorValues
      .ToDictionary(
         x => x.Split(':')[0].ToUpper(), 
         x => int.Parse(x.Split(':')[1]));

然后我想像上面那样拆分单词

【问题讨论】:

  • 你没有在任何地方使用Distinct
  • “它不起作用”是什么意思? InOrderSensorValues 是什么?你期望SensorValues 是什么?实际上是什么?
  • 请提供您遇到的问题的minimal reproducible example。这应该包括InOrderSensorValues 中产生重复数据的一小部分数据样本。
  • @Darren,我用过,但我不使用 toDictionary
  • @Sweeper,SensorValues 是一个带有字符串值的简单列表,例如“Sensor1:2”,我正在尝试拆分字符串。我想将 Sendor1 作为键放入字典和值 2 等

标签: c# list linq dictionary duplicates


【解决方案1】:

ToDictionary() 设计的重复键失败。您可以过滤掉您的数据,或在其前插入GroupBy() 以消除重复条目。

最后,您还可以考虑ToLookup(),它确实允许重复键。

添加GroupBy() 是这样的:

public Dictionary<string, int> SensorValues => 
     InOrderSensorValues.GroupBy(x => x.Split(':')[0].ToUpper()).
     ToDictionary(g => g.Key, g => int.Parse(g.First().Split(':')[1]));

【讨论】:

  • 它说 g 在上下文中不存在。当我说 g.First()
【解决方案2】:

您可以使用Select 保存Split 字符串,然后使用GroupBy 键,然后使用多个值的选择方法创建Dictionary - 我选择了First

public Dictionary<string, int> SensorValues => InOrderSensorValues
      .Select(sv => sv.Split(':'))
      .GroupBy(svp => svp[0].ToUpper(), svp => svp[1])
      .ToDictionary(
         kvp => kvp.Key, 
         kvp => int.Parse(kvp.First()));

【讨论】:

    猜你喜欢
    • 2013-11-21
    • 2012-10-22
    • 2019-03-12
    • 2022-08-18
    • 1970-01-01
    • 2015-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多