如何用LINQ统计List<Tuple<int,double>>重复项数量并求和排序?
解决方案
可以通过LINQ的分组、聚合和排序方法直接实现需求,具体代码和说明如下:
核心实现代码
List<Tuple<int, double>> originalList = new List<Tuple<int, double>> { Tuple.Create(1, 2.5), Tuple.Create(2, 3.0), Tuple.Create(1, 1.5), Tuple.Create(3, 4.0), Tuple.Create(2, 2.0), Tuple.Create(2, 1.0) }; // 生成目标列表 var result = originalList .GroupBy(tuple => tuple.Item1) .Select(group => new { OriginalItem1 = group.Key, RepeatCount = group.Count(), TotalItem2 = group.Sum(tuple => tuple.Item2) }) .OrderByDescending(stats => stats.RepeatCount) .ToList();
代码分步解释
GroupBy(tuple => tuple.Item1):将原列表中Item1值相同的元组归为同一组,分组键就是Item1的值Select(...):对每个分组做投影处理,提取三个核心数据:原Item1值、分组内元素的重复数量、分组内所有Item2的总和OrderByDescending(stats => stats.RepeatCount):按照重复数量从大到小排序结果ToList():将最终的查询结果转换为列表类型
扩展:返回强类型结果
如果需要返回强类型而非匿名类型,可以自定义一个类来存储统计结果:
public class ItemStats { public int Item1 { get; set; } public int RepeatCount { get; set; } public double TotalItem2 { get; set; } } // 修改Select部分代码即可 .Select(group => new ItemStats { Item1 = group.Key, RepeatCount = group.Count(), TotalItem2 = group.Sum(tuple => tuple.Item2) })
内容的提问来源于stack exchange,提问作者Rafael
相关产品推荐
相关产品推荐

