【问题标题】:How to sum up values of duplicate keys in a dictionary?如何总结字典中重复键的值?
【发布时间】:2021-02-04 19:16:19
【问题描述】:

我在电子表格(DevExpress 电子表格)中有 5 列。前四列是字符串值。第五列是整数(数字)。我加入了前四列并将其作为 KEY 放在一个列表中,然后将第五列条目作为 VALUE 收集到另一个列表中。我使用这两个列表来创建字典。 现在,我想对与每个重复键相关的值求和。就像你现在一样,字典对象为重复键抛出异常并删除相关的重复键(保留唯一键)。如何对与每个重复键相关的值求和? 我试过这个:

{
        IWorkbook workbook = spreadsheetControl.Document;
        Worksheet worksheet = workbook.Worksheets.ActiveWorksheet;
        CellRange range = worksheet.GetDataRange();
        int LastRow = range.BottomRowIndex;
        var keys = new List<string>();
        var values = new List<int>();

        for (int i = 0; i < LastRow + 1; i++)
        {
            keys.Add(string.Join(",", worksheet.Cells[i, 0].DisplayText, worksheet.Cells[i, 1].DisplayText,
                worksheet.Cells[i, 2].DisplayText, worksheet.Cells[i, 3].DisplayText));
            values.Add((int)worksheet.Cells[i, 4].Value.NumericValue);
        }
        var mydic = new Dictionary<string, int>();
        for (int i = 0; i < keys.Count; i++)
        {
            try
            {
                mydic.Add(keys[i], values[i]);
            }
            catch (Exception)
            {
                
            }
        }
    }

【问题讨论】:

  • 我不想写一个完整的答案,所以让我描述一下这个过程。 1.数据应该在一个数组中,因为字典不能有重复。 array.GroupBy(x =&gt; x.Key).ToDictionary(x =&gt; x.Key, v =&gt; v.ToArray()). 现在您将拥有一个包含所有值的键,您可以采用第一个并假设所有值都相同,或者如果值不同,则为它们创建新键等
  • 只需在第一个“for”中使用字典即可​​。检查密钥是否存在。必要时添加密钥。然后通过键提取现有值,将其与新值相加,然后通过键更新现有值。

标签: c#


【解决方案1】:

在第一个for-loop 中使用字典和TryGetValue

var myDictionary = new Dictionary<string, int>();
for (int i = 0; i < LastRow + 1; i++)
{
    string key = string.Join(",", worksheet.Cells[i, 0].DisplayText, worksheet.Cells[i, 1].DisplayText, worksheet.Cells[i, 2].DisplayText, worksheet.Cells[i, 3].DisplayText);
    int value = (int)worksheet.Cells[i, 4].Value.NumericValue;
    if(myDictionary.TryGetValue(key, out int oldValue)) 
        value += oldValue;
    myDictionary[key] = value;
}

如果键不存在,dictionary indexer 的设置器永远不会抛出异常,而不是 Add method。如果存在,它将用新值替换旧值。

【讨论】:

    【解决方案2】:

    您需要先检查密钥是否存在。如果键已经存在,则直接添加值,而不是调用Add() 方法。

        var mydic = new Dictionary<string, int>();
        for (int i = 0; i < keys.Count; i++)
        {
            if(mydic.ContainsKey(keys[i]))
                mydic[keys[i]] += values[i];
            else
                mydic.Add(keys[i], values[i]);
        }
    

    【讨论】:

    • 这会聚合 OP 原始代码中的值,如果它不是第一个值,则它们会忽略该值
    • 原始代码无论如何都不做 sum ,而问题描述说 sum 是意图。 Now, I want to sum values related to each duplicate keys.
    猜你喜欢
    • 2020-12-21
    • 1970-01-01
    • 1970-01-01
    • 2019-01-16
    • 1970-01-01
    • 2019-02-04
    • 2020-04-20
    • 2012-01-24
    • 2019-11-13
    相关资源
    最近更新 更多