求GroupBy带键选择器与元素选择器重载的等效LINQ查询语法
等效LINQ查询语法解析
你问的这个GroupBy<TSource, TKey, TElement>重载,对应的LINQ查询语法其实很直观——就是**group [投影后的元素] by [分组键]**的形式。
举个具体的例子帮你理解:假设我们有一个Product集合,每个产品有ProductId、ProductName和CategoryId属性。如果用方法语法写的话是这样:
// 方法语法:使用带elementSelector的GroupBy重载 var groupedProducts = products.GroupBy( p => p.CategoryId, // keySelector:按CategoryId分组 p => new { p.ProductId, p.ProductName } // elementSelector:只保留产品ID和名称作为组内元素 );
对应的LINQ查询语法就是:
// 查询语法:完全等效于上面的方法调用 var groupedProducts = from p in products group new { p.ProductId, p.ProductName } by p.CategoryId;
关键点说明
- 查询语法里,
group后面的部分就是elementSelector的逻辑——你可以在这里直接定义要放入分组的元素(比如投影成匿名类型、某个单一属性,甚至是经过计算的值)。 by后面的部分就是keySelector的逻辑,用来指定分组的依据键。- 编译器会自动把这个查询语法翻译成你提到的那个
GroupBy泛型重载,两者在运行时的行为完全一致。
如果是不带elementSelector的简单分组(比如直接把原元素放入分组),查询语法就是group p by p.CategoryId,对应的是另一个不带elementSelector的GroupBy重载——而你问的这个带投影元素的场景,只需要在group后面明确写出要投影的元素即可。
内容的提问来源于stack exchange,提问作者InBetween
相关产品推荐
相关产品推荐

