我想知道是否有一个众所周知且有效的算法可以在List中找到重复项,将它们全部加在其中一个上并删除另一个?
例如,1 1 3 2 1 2 3
变为3 4 6
。
答案 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
的使用引用
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