本文摘自PHP中文网,作者黄舟,侵删。
我们经常在一个内存集合,比如List,根据某个或某些个属性分组,统计显示。最容易想到的方法便是,根据某个关键属性,对List实例遍历,转化为如下字典类型1 |
|
举例,已知cars,
1 2 3 4 5 6 7 8 |
|
想以id为键,值为Car转化为一个字典idCarDict,除了遍历这种逻辑最复杂,代码需要最多的方法,我们还可以直接利用ToDictionary方法,
1 |
|
但是,这个方法是有局限的,关键码对应的对象实例只能有一个,也就是返回的类型为,
1 |
|
这是糟糕的,因为可能一个关键码对应多个实例,此时就得借助GroupBy,先按关键码分组后,然后再转化为字典。
比如,我们想以type为键,得到这个车型下的多台汽车,
1 2 3 |
|
这种转化代码简洁,比以下遍历逻辑好很多!
1 2 3 4 5 |
|
这样解决了一个关键码对应多个实例的转化,那么根据多个关键码的组合对应多个实例的问题,借助List上的GroupBy能实现吗? 不能实现。
这时候,需要写Linq语句,将多个关键码组合为一个新的对象,
1 |
|
举一个列子,我们有这么一个集合,集合中的元素是ValPair对象,这个对象包含两个整形元素,Val1是小者,Val2相对大些。如何按照Val1,Val2的组合分组呢?
请看下面逻辑:
1 2 3 4 5 6 7 8 9 10 |
|
总结
List的GroupBy只能根据一个键分组,如果需要根据多个键组合分组,就得写Linq语句组合。
以上就是.NET框架-集合和LINQ中的“分组”技术代码详解的详细内容!
相关阅读 >>
.NET框架-string是value还是reference type的详解
如何使用linq、lambda 表达式 、委托快速比较两个集合,找出需要新增、修改、删除的对象(附代码)
.NET框架-xml.serialization的思维导图分享
.NET框架-try-parse和tester-doer的使用区别
更多相关阅读请进入《.NET框架》频道 >>

C#高级编程(第11版) C# 7 & .NET Core 2.0(.NET开发经典名著)
作者:[美]克里斯琴·内格尔(Christian Nagel)著。出版时间:2019年3月。