算法 - 聚合重复记录

时间:2017-06-14 15:15:31

标签: c# algorithm

我想知道是否有一个众所周知且有效的算法可以在List中找到重复项,将它们全部加在其中一个上并删除另一个?

例如,1 1 3 2 1 2 3变为3 4 6

3 个答案:

答案 0 :(得分:2)

使用GroupBy()Sum()扩展程序,您可以完成所需的操作:

int[] nums = new int[] { 1, 1, 3, 2, 1, 2, 3, 4, 7 };       
var result = nums.GroupBy(number => number).Select(grouping => grouping.Sum());    

我的解决方案还考虑了是否只有一个值的实例,它仍然将其保留在结果中(显然没有对它进行求和)。

工作小提琴here

答案 1 :(得分:1)

只需GroupBy

 int[] source = new int[] { 1, 1, 3, 2, 1, 2, 3 };

 var result = source
   .GroupBy(x => x, (k, s) => s.Sum())
   .OrderBy(x => x) // if you want result being ordered, "3 4 6" (not "3 6 4")
   .ToArray(); 

 // 3 4 6
 Console.Write(string.Join(" ", result));    

答案 2 :(得分:0)

您可以使用以下代码:

int[] numbers = new int[] { ..... };

var result = from i in numbers
             group i by i into g
             select g.Sum();

如果您想知道频繁出现的号码,可以使用以下代码段:

var result = from i in numbers
             group i by i into g
             select new { Value = g.Key, Count = g.Sum() };

您可以使用以下结果:

foreach (var elem in result)
{
    Console.WriteLine($"The number '{elem.Value}' occurs {elem.Count} times.");
}

<小时/> 如果您不喜欢LINQ查询语法,可以使用以下代码:

var result = numbers.GroupBy(i => i)
                    .Select(g => new { Value = g.Key, Count = g.Sum() });

不要忘记包含对global::System.Linq 的使用引用

<小时/> 有关更多LINQ示例,请参阅以下链接:

https://docs.microsoft.com/en-us/dotnet/csharp/linq/group-query-results
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/group-clause