Linq 中按照多个值进行分组(GroupBy) 后进行求和

本文介绍使用C#进行集合的分组与聚合操作,包括如何使用GroupBy方法按特定属性分组,并进行求和等聚合计算。同时,演示了不同方式实现分组聚合,如使用匿名类型、Func委托及自定义类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

static void Main(string[] args)
        {
            List<User> products = new List<User>()
           {
                new User(){ Id="1", Name="n1",count1=1},
                new User(){ Id="1", Name="n1",count1=2},
                new User(){ Id="2", Name="n2",count1=3},
                new User(){ Id="2", Name="n2",count1=4},
           };

            var group = products.GroupBy(x => new { x.Id, x.Name })
                .Select(g => new
                {
                    Id = g.Key.Id,
                    Name = g.Key.Name,
                    count1 = g.Sum(t => t.count1)
                }).ToList();
 

            Func<User, dynamic> exp = x => new { x.Id, x.Name };


           var group1 = products.GroupBy(exp)
                     .Select(g => new
                     {
                         Id = g.Key.Id,
                         Name = g.Key.Name,
                         count1 = g.Sum(t => t.count1)
                     }).ToList();

            Func<User, GroupUser> func = x => new GroupUser { Id = x.Id, Name = x.Name };
            var group2 = products.GroupBy(func)
                     .Select(g => new
                     {
                         Id = g.Key.Id,
                         Name = g.Key.Name,
                         count1 = g.Sum(t => t.count1)
                     }).ToList();
 
        }
  
    public class User
    {
        public string Id { get; set; }
        public string Name { get; set; }
        public int count1 { get; set; }

    }

    public class GroupUser
    {
        public string Id { get; set; }
        public string Name { get; set; }
    }

//分组后进行排序返回第一个
List<QualityPerformanceData> maxGroup = qualityPerformanceDataList
                    .DistinctBy(d => new { d.AnalysisItemCode, d.Lower, d.Upper })
                    .OrderBy(x => x.AnalysisItemName)
                    .GroupBy(x => x.AnalysisItemCode)
                    .Select(group => group.OrderByDescending(item => item.Lower).First())
                    .ToList();

输出:


            foreach (var item in tt)
            {
                MessageBox.Show(item.Id + "---" + item.Name + "---" + item.count1);
            }

  

### VB.Net 中实现 DataTable 的多列分组并多列求和 在 VB.Net 中,可以利用 LINQ 来处理 `DataTable` 的复杂查询需求,比如多列分组以及多列求和的操作。以下是具体的实现方式: #### 使用 LINQ 对 DataTable 进行多列分组和多列求和 LINQ 提供了一种简洁的方式来对数据表中的记录进行分组和聚合计算。下面是一个完整的代码示例,展示如何基于多个字段进行分组,并对其他字段执行求和操作。 ```vb Imports System.Data Imports System.Linq Module Module1 Sub Main() ' 创建一个示例 DataTable 并填充一些测试数据 Dim dt As New DataTable() dt.Columns.Add("GroupColumn", GetType(String)) dt.Columns.Add("SubGroupColumn", GetType(String)) dt.Columns.Add("Value1", GetType(Integer)) dt.Columns.Add("Value2", GetType(Integer)) dt.Rows.Add("A", "X", 10, 20) dt.Rows.Add("A", "Y", 30, 40) dt.Rows.Add("B", "X", 50, 60) dt.Rows.Add("A", "X", 70, 80) ' 将 DataTable 转换为可查询的对象集合 Dim query = From row In dt.AsEnumerable() Group By groupKey = New With { Key .MainGroup = row.Field(Of String)("GroupColumn"), Key .SubGroup = row.Field(Of String)("SubGroupColumn") } Into g = Group Select New With { .MainGroup = groupKey.MainGroup, .SubGroup = groupKey.SubGroup, .SumOfValue1 = g.Sum(Function(x) x.Field(Of Integer)("Value1")), .SumOfValue2 = g.Sum(Function(x) x.Field(Of Integer)("Value2")) } ' 输出结果到控制台 For Each result In query Console.WriteLine($"MainGroup: {result.MainGroup}, SubGroup: {result.SubGroup}, Sum of Value1: {result.SumOfValue1}, Sum of Value2: {result.SumOfValue2}") Next End Sub End Module ``` 上述代码实现了以下功能: - 定义了一个包含四列的 `DataTable` (`GroupColumn`, `SubGroupColumn`, `Value1`, 和 `Value2`)。 - 基于两列(`GroupColumn` 和 `SubGroupColumn`)进行了分组[^4]。 - 针对每组分别计算了另外两个数型列(`Value1` 和 `Value2`)的总和[^2]。 通过这种方式,能够轻松完成复杂的分组与汇总逻辑。 --- #### 关键点解析 1. **转换为可枚举对象** 利用 `.AsEnumerable()` 方法将 `DataTable` 转化成支持 LINQ 查询的数据源。 2. **动态创建匿名类型用于分组** 在 `Group By` 子句中,可以通过 `New With` 动态构建匿名类型的实例作为分组依据。 3. **调用聚合函数** 在 `Select` 子句中应用 `.Sum(...)` 函数来获取目标列的合计。 4. **性能优化建议** 如果涉及大规模数据集,则应考虑使用更高效的库或框架替代纯内存运算的方式,例如借助第三方工具如 `data.table` 或数据库引擎直接处理[^3]。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值