如何在List <string,int =“”>中查找重复项并求和它们的值

时间:2019-02-13 15:49:21

标签: c# list file duplicates

我有一个文件,其中一行有两个。有一个名称及其
价值。有些名称相同,我希望我的代码识别重复项并总结其值 示例:
第1行:3(行数(名称值)
第2行:ABC 5
第3行:XYZ 8
第4行:ABC 3

感谢您的所有答复。

2 个答案:

答案 0 :(得分:2)

最简单的方法是使用ReadLines枚举文件,然后使用LINQ进行分组/聚合以删除重复项并求和值

第一行是无关紧要的,因此您可以简单地Skip那个

var result = File.ReadLines(@"c:\pathto\yourfile.txt")
             .Skip(1)  // skip the first line
             .Select(line => line.Split(' ')) // Split on the space gving an array of 2 elements
             .GroupBy(x => x[0]) // group by the first element
             .Select(g => new {
                           Key = g.Key, 
                           Value = g.Sum(x => int.Parse(x[1]))
                          }); // select into an anonymous object

演示:https://rextester.com/KSNI79479

(注意,演示程序无法使用文件,但会使用数组复制文件的内容)

答案 1 :(得分:1)

您需要解决这个问题,可以使用Dictionary存储结果。

步骤1:读取文件。您可以使用File.ReadLines。

第2步::除了第一次以外,遍历所有行,并根据分隔符(您的情况是空格)分割它们

步骤3::如果键(步骤2中字符串拆分的第一部分)已经在字典中,则需要对值求和。否则,在字典中创建一个新条目。

结果可以存储在字典中。您需要确保对重复项进行汇总。

var lines = File.ReadLines(@"e:\sample.txt");
var dictionary = new Dictionary<string,int>();
foreach(var line in lines.Skip(1))
{
   var values = line.Split(new string[]{" "},StringSplitOptions.RemoveEmptyEntries);
    if(dictionary.TryGetValue(values[0],out var value))
    {
       dictionary[values[0]] = (value +=int.Parse(values[1]));
    }
    else
    {
      dictionary.Add(values[0], int.Parse(values[1]));
    }
}

样本输入

3
ABC 5
XYZ 8
ABC 3

样本输出

enter image description here