c#中查询表达式GroupBy的使用
c#中查询表达式GroupBy的使用
说明:
c#中实现IEnumerable<T>接口的类提供了很多扩展方法,其中Select,Where等为最常见的,且几乎和Sql语法类似比较好理解,基本满足了日常处理集合的大部分需求,然而还有一部分稍有不一样理解起来比较拗,实际分析一下实现的原理倒也很好理解,本篇文章介绍一下GroupBy的使用方法。
实验基础数据用例:
Student类:
public class Student { public int StuId { get; set; } public string ClassName { get; set; } public string StudentName { get; set; } }
设定数据如下:
List<Student> studentList = new List<Student> { new Student {ClassName = "软工一班", StudentName = "康巴一", StuId = 1}, new Student {ClassName = "软工一班", StudentName = "康巴二", StuId = 2}, new Student {ClassName = "软工一班", StudentName = "康巴三", StuId = 3}, new Student {ClassName = "软工二班", StudentName = "康定一", StuId = 4}, new Student {ClassName = "软工二班", StudentName = "康定二", StuId = 5}, new Student {ClassName = "软工二班", StudentName = "康定三", StuId = 6}, };
我们假设两个班里的学生总共有六名,现在根据班级分组
IEnumerable<IGrouping<string, Student>> studentGroup = studentList.GroupBy(s => s.ClassName);
如代码,调用GroupBy扩展方法后,返回类型为IEnumerable<IGrouping<string, Student>>, IEnumerable代表了返回结果可被foreach遍历,其中泛型实现为IGrouping<string,Student>,按照普遍理解的分组的概念,可以推断IGrouping中应该是string代表的是一个key,即ClassName,那么key对应的应该就是一个Student的集合,但是代码应该怎样实现呢?
可以首先foreach一下studentGroup
foreach (IGrouping<string, Student> item in studentGroup) { }
这时候可以item.一下看看提示信息
这时候发现,只能提示出来的属性只有一个key,那么怎样通过item获取到分组后的Student集合呢?这时候发现第二个GetEnumerator()方法,这个说明了item是可以被foreach的,类型为IEnumerator<Student>,说明了可被遍历的类型为Student
然后可以foreach下item试一试
如果所示,果然是Student,根据推断,现在在foreach中遍历所有数据,然后打出来看一下
foreach (IGrouping<string, Student> item in studentGroup) { Console.WriteLine(item.Key); foreach (var student in item) { Console.WriteLine(student.StudentName); } }
执行结果如下:
所以可以断定item是一个Student的集合,那么为什么item还有个key属性呢,好像是和平常的集合不太一样,事实确实是不一样的,我们看下IGrouping的定义如下:
public interface IGrouping<out TKey, out TElement> : IEnumerable<TElement>, IEnumerable { /// <summary> /// 获取 <see cref="T:System.Linq.IGrouping`2"/> 的键。 /// </summary> /// /// <returns> /// <see cref="T:System.Linq.IGrouping`2"/> 的键。 /// </returns> [__DynamicallyInvokable] TKey Key { [__DynamicallyInvokable] get; } }
IGrouping的key是作为自己的属性来存储了,TElement则实现了IEnumerable<TElement>,所以调用foreach遍历IGrouping的时候返回的即是Student的集合了
这个探索是挺有趣的,通过神器vs的智能提示和源码的实现最终知道了GroupBy的用法,并且了解了为什么这样用。
同时也看出了通过接口可以巧妙的实现多态,其中自然是妙趣无穷!
相关文章
- C#中Linq查询条件动态化
- 从 C# 崩溃异常 中研究页堆布局
- c#代码 天气接口 一分钟搞懂你的博客为什么没人看 看完python这段爬虫代码,java流泪了c#沉默了 图片二进制转换与存入数据库相关 C#7.0--引用返回值和引用局部变量 JS直接调用C#后台方法(ajax调用) Linq To Json SqlServer 递归查询
- 反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑) C#中缓存的使用 C#操作redis WPF 控件库——可拖动选项卡的TabControl 【Bootstrap系列】详解Bootstrap-table AutoFac event 和delegate的分别 常见的异步方式async 和 await C# Task用法 c#源码的执行过程
- .net 反射访问私有变量和私有方法 如何创建C# Closure ? C# 批量生成随机密码,必须包含数字和字母,并用加密算法加密 C#中的foreach和yield 数组为什么可以使用linq查询 C#中的 具名参数 和 可选参数 显示实现接口 异步CTP(Async CTP)为什么那样工作? C#多线程基础,适合新手了解 C#加快Bitmap的访问速度 C#实现对图片文件的压
- [译]RabbitMQ教程C#版 - “Hello World”
- C# 字符串拼接性能探索 c#中+、string.Concat、string.Format、StringBuilder.Append四种方式进行字符串拼接时的性能
- C#使用oledb连接excel运行Insert Into语句出现“操作必须使用一个可更新的查询”的解决的方法
- c# asp.mvc 从客户端(...)中检测到有潜在危险的 Request.Form 值
- C# mongodb中内嵌文档数组条件查询
- c# 在mongo中查询经纬度范围
- C#,深度好文,精致好码,文本对比(Text Compare)算法与源代码
- C#数据库教程3-ADO.NET其它优化功能
- c#中代码中多线程动态创建progressbar的实例,概念很重要可扩展很多类似概念
- C# DateTime 日期加1天 减一天 加一月 减一月 等方法
- Unity 面试题汇总(二)之 C# 位运算、算法基础
- 《C#零基础入门之百识百例》(七十)LINQ的查询语法 -- 示例练习
- C# winForm 多条件模糊查询实现(主要讲思路,请忽略与数据库(sqlite)相关的代码)
- c#串口编程(转)
- c#代码规则,C#程序中元素的命名规范