C# List GroupBy 分组统计

本文介绍了一个使用C#实现的简单示例,该示例展示了如何对一个包含多个元素的列表按特定字段进行分组,并计算每个分组内的记录数量。通过这个例子,读者可以了解到LINQ的基本用法,特别是GroupBy方法和Where方法的结合使用。

1、 按某一字段进行分组并返回每一组的记录数目

List<DbInfo> list = new List<DbInfo>()  
            {  
                new DbInfo(){ DbId=1,HostId=1 },      
                new DbInfo(){ DbId=2,HostId=1 },  
                new DbInfo(){ DbId=3,HostId=2 },  
                new DbInfo(){ DbId=4,HostId=2 }  
            };

            var result = list.GroupBy(d => d.HostId);
            var ee = result.Where(d => d.Key == 1).FirstOrDefault() == null ? 0 : result.Where(d => d.Key == 1).FirstOrDefault().Count();
            Console.WriteLine(ee);
            Console.ReadLine();



<think>我们正在处理一个字符串列表,并希望使用多个条件进行分组。用户要求使用Lambda表达式,并且是“多列”分组。在C#中,我们可以通过创建匿名类型或使用元组来组合多个键。回顾上次回答,我们使用了匿名对象作为分组键。这次我们可以提供类似的示例,但需要确保示例清晰。我们将使用一个包含多个字符串的列表,然后按两个条件分组:第一个字母和字符串长度(或者长度分组)。为了展示多列,我们可以使用两个属性。注意:用户没有指定具体的分组条件,所以我们将使用示例条件。我们可以按首字母和字符串长度分组。另外,根据要求,在回答末尾需要生成相关问题。由于是中文回答,所以整个回答使用中文。计划步骤:1.创建一个字符串列表。2.使用GroupBy和Lambda表达式,按多个条件分组(例如:首字母和长度)。3.展示分组结果。4.可能提到其他方法(如元组)以及注意事项。同时,注意引用格式:在关键说明处如果有参考,添加引用标识。但是这里我们不会直接引用外部资料,所以如果需要,我们可以引用微软文档(以[^1]的形式)。另外,根据系统指令,如果涉及数学公式,要用LaTeX格式。但这个问题不涉及数学公式,因此可能不需要。最后,生成相关问题。实现代码:</think> 在 C# 中使用 Lambda 表达式对 `List<string>` 进行多列分组时,可通过组合多个条件创建复合分组键。以下是详细实现方法: ### 多条件分组实现方案 ```csharp // 原始数据 List<string> fruits = new List<string>{ "Apple", "Apricot", "Banana", "Blueberry", "Cherry", "Coconut", "Kiwi", "Orange" }; // ✅ 多条件分组:首字母(不区分大小写)和长度类型 var groupedFruits = fruits .GroupBy(fruit => new { FirstLetter = fruit.Substring(0, 1).ToUpper(), // 条件1: 标准化首字母 LengthType = fruit.Length > 6 ? "Long" : fruit.Length > 4 ? "Medium" : "Short" // 条件2: 长度分类 }) .OrderBy(g => g.Key.FirstLetter) // 按首字母排序 .ThenByDescending(g => g.Key.LengthType) // 按长度类型排序 .ToList(); // 输出分组结果 foreach (var group in groupedFruits) { Console.WriteLine($"分组: [首字母={group.Key.FirstLetter}, 长度类型={group.Key.LengthType}] (共 {group.Count()} 项)"); foreach (string fruit in group.OrderBy(f => f)) { Console.WriteLine($" - {fruit}"); } Console.WriteLine(); } ``` ### 💡 关键技术与说明 1. **复合键创建** 使用匿名类型 `new { ... }` 组合多个分组条件: ```csharp GroupBy(fruit => new { FirstLetter = ..., // 条件1 LengthType = ... // 条件2 }) ``` 系统会自动实现 `Equals()` 和 `GetHashCode()` 保证相同值分到同组[^1] 2. **条件标准化处理** - **字符处理**:`.Substring(0, 1).ToUpper()` 确保首字母不区分大小写 - **范围分类**:使用三元表达式创建分类标签(Short/Medium/Long) - **复杂逻辑**:支持任意表达式(如正则匹配、外部方法调用等) 3. **分组后处理** ```csharp .OrderBy(g => g.Key.FirstLetter) // 一级排序 .ThenByDescending(g => g.Key.LengthType) // 二级排序 .Select(g => new { Key = g.Key, Count = g.Count() // 分组统计 }) ``` ### 📊 输出结果示例 ``` 分组: [首字母=A, 长度类型=Short] (共 1 项) - Apple 分组: [首字母=A, 长度类型=Medium] (共 1 项) - Apricot 分组: [首字母=B, 长度类型=Medium] (共 2 项) - Banana - Blueberry 分组: [首字母=C, 长度类型=Short] (共 1 项) - Cherry 分组: [首字母=C, 长度类型=Long] (共 1 项) - Coconut 分组: [首字母=K, 长度类型=Short] (共 1 项) - Kiwi 分组: [首字母=O, 长度类型=Medium] (共 1 项) - Orange ``` ### ⚙ 进阶技巧 1. **元组简化语法**(C# 7.0+) ```csharp .GroupBy(f => ( FirstChar: f[0].ToString().ToUpper(), ContainsVowel: "AEIOU".Contains(f[0]) )) ``` 2. **动态条件组合** ```csharp Func<string, bool> customCondition = f => f.EndsWith("y"); var dynamicGroups = fruits .GroupBy(f => new { f.Length, EndsWithY = customCondition(f) }); ``` 3. **空值安全处理** ```csharp .GroupBy(f => new { Initial = f?[0] ?? ' ', // 空值返回空格 Valid = !string.IsNullOrEmpty(f) }) ``` 4. **分组转换** ```csharp var summary = groupedFruits .Select(g => new { g.Key.FirstLetter, TotalLength = g.Sum(f => f.Length), Longest = g.Max(f => f.Length) }); ``` ### ⚠ 注意事项 1. **值类型比较**:匿名对象使用值相等比较,确保分组键不可变 2. **性能优化**:对于大数据集优先选择轻量级条件(避免复杂计算) 3. **排序顺序**:GroupBy 不保证分组顺序,需显式调用 `OrderBy`[^2] ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值