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
相关产品推荐
相关产品推荐

