C#linq的group、count、sum,记一下

C#linq的group、count、sum,记一下。

//使用linq在内存中分组
                var qry = from t in dtMain.AsEnumerable()
                          group t by new { sName = t.Field<string>("sName"), sID = t.Field<string>("sID") } into grp
                          select new
                          {
                              sID = grp.Key.sID,
                              sName = grp.Key.sName,
                              nRows = grp.Count(p => p.Field<string>("sID") == grp.Key.sID)
                          };
                if (qry.ToList().Count > 0)
                    qry.ToList().ForEach(p =>
                    {   //追加写入行
                        iData.initializeRecord(db = dtGroup.NewRow());
                        dtGroup.Rows.Add(db);
                        db["sID"] = p.sID;
                        db["sName"] = p.sName;
                        db["nRows"] = p.nRows;
                    });

再加上一个取出来之后排序:

StringBuilder builder = new StringBuilder();
            //查出来
            var qry = from t in dbMain.AsEnumerable()
                      where (t.Field<string>("部门标记") == "" && !string.IsNullOrEmpty(t.Field<string>("ksmc")))
                      group t by new { ksmc = t.Field<string>("ksmc") } into grp
                      //orderby grp.Key.ksmc  //排序
                      select new
                      {   //值、重复次数
                          ksmc = grp.Key.ksmc,
                          nTotal = grp.Count(p => p.Field<string>("ksmc") == grp.Key.ksmc)
                      } into tmp
                      orderby tmp.nTotal    //按照数量排序
                      select tmp;
            //拼接起来
            qry.ToList().ForEach(p =>
            {   //拼接起来
                builder.AppendLine(p.ksmc + ",重复" + p.nTotal + "次;");
            });

 

var x = rows.AsEnumerable().GroupBy(p => p.Field<string>("sTuan"));
                sTuanWhere = "";
                foreach (IGrouping<string, DataRow> itm in x.ToList())
                {
                    //foreach (var dr in itm) if (string.IsNullOrEmpty(sTuan)) sTuan = dr["sTuan"].ToString(); else break;
                    if (string.IsNullOrEmpty(sTuan = itm.Key)) continue;      //没有团号的意外错误
                    //发出一个团的
}
var storeGroup = dtFrom.AsEnumerable().GroupBy(t => new
                {   //linq-groupby分组
                    sStorer = t.Field<string>("sStorer"),
                    sStorerName = t.Field<string>("sStorerName"),
                    sParty3ID = t.Field<string>("sParty3ID")
                });

<think>好的,我现在需要帮助用户解决在C#中使用LINQGroupBy方法根据多个键进行分组的问题。首先,我需要回顾一下LINQGroupBy的基本用法,尤其是多键分组的情况。 用户的问题是关于使用多个键进行分组,所以我要确保自己理解如何构造复合键。在C#中,GroupBy通常需要一个键选择器函数,当需要多个键时,可以通过匿名对象或元组来组合多个属性。比如,使用new { Key1 = x.Property1, Key2 = x.Property2 }作为键,这样就能根据这两个属性组合进行分组。 接下来,我需要确认示例的正确性。例如,假设有一个Person类,包含Name、City和Age属性,用户可能想按City和Age分组。这时候,使用GroupBy(p => new { p.City, p.Age })就能实现。然后,分组后的结果可以通过Select或foreach来处理每个分组,展示键和对应的元素。 另外,要注意的是,使用匿名类型时,编译器会自动生成Equals和GetHashCode方法,因此分组会正确工作。如果是使用元组,比如GroupBy(p => Tuple.Create(p.City, p.Age)),也是可行的,但匿名对象可能更直观。 我还需要检查是否有其他方法可以实现多键分组,比如使用自定义的IEqualityComparer,但这种情况较少见,通常匿名对象已经足够。因此,示例应重点放在匿名对象的使用上。 然后,考虑到用户可能需要进一步的操作,比如对分组后的结果进行统计或排序,可以添加一些扩展示例,例如计算每组的数量或平均年龄。这样能帮助用户更全面地应用GroupBy方法。 同时,需要确保代码示例的正确性,比如是否正确处理空值,是否包含必要的命名空间(如System.Linq)。在示例中,可能需要提醒用户引入System.Linq,并确保数据源正确初始化。 最后,根据用户的要求生成相关问题,这些问题应该围绕GroupBy的高级用法、性能考虑、与其他方法的比较等展开,帮助用户深入理解。</think>在C#中使用LINQ的`GroupBy`方法根据多个键进行分组时,可以通过匿名对象或元组组合多个属性作为复合键。以下是具体实现步骤和示例: ### 步骤说明 1. **定义数据源**:创建包含需要分组属性的对象集合 2. **构造复合键**:使用匿名类型`new { }`组合多个键值 3. **分组处理**:通过`GroupBy`配合复合键进行分组操作 4. **结果处理**:遍历分组结果进行后续操作 ### 示例代码 ```csharp // 定义数据模型 class Person { public string Name { get; set; } public string City { get; set; } public int Age { get; set; } } // 数据初始化 List<Person> people = new List<Person> { new Person { Name = "Alice", City = "Beijing", Age = 25 }, new Person { Name = "Bob", City = "Shanghai", Age = 30 }, new Person { Name = "Charlie", City = "Beijing", Age = 25 } }; // 多键分组查询 var groupedPeople = people .GroupBy(p => new { p.City, p.Age }) // 匿名对象作为复合键 .Select(g => new { City = g.Key.City, Age = g.Key.Age, Count = g.Count(), Members = g.Select(p => p.Name) }); // 输出结果 foreach (var group in groupedPeople) { Console.WriteLine($"City: {group.City}, Age: {group.Age}"); Console.WriteLine($"Count: {group.Count}, Members: {string.Join(", ", group.Members)}"); Console.WriteLine("-------------------"); } ``` ### 输出结果 ``` City: Beijing, Age: 25 Count: 2, Members: Alice, Charlie ------------------- City: Shanghai, Age: 30 Count: 1, Members: Bob ------------------- ``` ### 关键要点 1. **复合键构造**:使用`new { Property1, Property2 }`创建匿名类型,编译器会自动生成相等比较逻辑[^2] 2. **分组结果处理**:每个分组的`Key`属性包含复合键值,可通过`g.Key.PropertyName`访问 3. **扩展操作**:分组后支持`Count()`、`Sum()`等聚合操作,也可嵌套其他LINQ查询
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值