You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#如何处理CSV重复键构建多值字典并调整同键值总和

问题错误原因与完整实现

报错原因

  • CS1526错误:泛型集合实例化语法错误,new List<(string Key, double Value)>后面缺失构造方法必需的括号(),正确写法为new List<(string Key, double Value)>()
  • CS1503错误:类型不匹配,你定义的List存储的是(string, double)值元组,调用Add方法时传入的是KeyValuePair<string, double>类型,二者不兼容;同时还存在变量名拼写错误(eIDdictlist错写为employedictlist)
  • 其他逻辑错误:你的CSV只有两列(eid、hr),分割后rowData的有效索引只有0和1,写rowData[7]会触发索引越界;双层循环的逻辑会把所有eid和所有hr乱序配对,完全不符合同eid对应自身hr值的需求

完整可运行代码

using System;
using System.Collections.Generic;
using System.Linq;

namespace CSVRead 
{
    class Program
    {
        static void Main(string[] args)
        {
            // 读取CSV所有行,跳过表头
            string[] csvLines = System.IO.File.ReadAllLines("//替换为你的CSV文件实际路径");
            // 任务1:构造存储结构 Dictionary<string, List<double>>  key为eid,value为对应hr值集合
            Dictionary<string, List<double>> eidHrDict = new Dictionary<string, List<double>>();

            for (int i = 1; i < csvLines.Length; i++)
            {
                string[] rowData = csvLines[i].Split(',');
                string eid = rowData[0].Trim();
                double hr = Convert.ToDouble(rowData[1].Trim());

                // 字典中不存在该eid则新增键值对,存在则追加hr值
                if (!eidHrDict.ContainsKey(eid))
                {
                    eidHrDict[eid] = new List<double>();
                }
                eidHrDict[eid].Add(hr);
            }

            // 输出任务1的存储结果
            Console.WriteLine("=====任务1存储结果=====");
            int index = 1;
            foreach (var kvp in eidHrDict)
            {
                foreach (var hrVal in kvp.Value)
                {
                    Console.WriteLine($"key{index}: {kvp.Key} value{index}: {hrVal}");
                    index++;
                }
            }

            // 任务2:调整值,同键总和大于50则按比例缩放到总和为50
            Console.WriteLine("\n=====任务2调整后结果=====");
            foreach (var kvp in eidHrDict)
            {
                double sum = kvp.Value.Sum();
                if (sum > 50)
                {
                    // 计算缩放比例
                    double ratio = 50 / sum;
                    for (int i = 0; i < kvp.Value.Count; i++)
                    {
                        kvp.Value[i] = Math.Round(kvp.Value[i] * ratio, 2); //保留两位小数可按需修改
                    }
                }
                // 输出调整后的值
                Console.WriteLine($"eid:{kvp.Key} 调整后hr值:{string.Join(", ", kvp.Value)} 总和:{kvp.Value.Sum():F2}");
            }

            Console.ReadKey();
        }
    }
}

效果说明

  • 输入CSV中的ABC对应hr总和为60>50,会按比例缩放为20.83、29.17,总和为50
  • FDG总和为50无需调整,LMN总和为61>50会直接缩放为50

内容的提问来源于stack exchange,提问作者exd-AS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 11:06:03