我有一个问题,我和我的朋友正在做代码,他做了两个方法,我不完全理解。
public static List<Borrow> GetDistinctBorrows(List<Borrow> list)
{
var Result = (from bor in list group bor by new { bor.BookAccessor, bor.ReaderAccessor } into dist select dist.First()).ToList();
return Result;
}
和第二个
public static List<Borrow> GetDistinctBorrows(List<Borrow> list)
{
var Result = list.GroupBy(x => new { x.ReaderAccessor, x.BookAccessor }).Select(y => y.First()).ToList();
return Result;
}
这些方法具有相同的功能,但一个是用LINQ编写的,另一个是用lambda表达式编写的。
谁能给我解释一下,它们是如何工作的(特别是带有"new"字的片段)?
new
字的部分是如何在匿名类型上定义实例。
匿名类型提供了一种方便的方法,可以将一组只读属性封装到单个对象中,而不必先显式地定义类型。类型名称由编译器生成,在源代码级别不可用。每个属性的类型由编译器推断。
通过使用
new
操作符和对象初始化器来创建匿名类型。有关对象初始化器的更多信息,请参见对象和集合初始化器(c#编程指南)。
作为旁注,您的查询是等效的,因为编译器会将第一个转换为第二个作为编译过程的一部分。在MSDN上阅读更多内容:LINQ (c#)中的查询语法和方法语法
介绍性语言集成查询(LINQ)文档中的大多数查询都是使用LINQ声明性查询语法编写的。但是,在编译代码时,必须将查询语法转换为. net公共语言运行时(CLR)的方法调用。这些方法调用调用标准查询操作符,其名称为
Where
,Select
,GroupBy
,Join
,Max
和Average
。您可以通过使用方法语法而不是查询语法直接调用它们。
函数从输入列表中获取不同项的列表,其中ReaderAccessor和BookAccessor确定相等性。输入列表中的重复项将被丢弃。
它们的工作原理是按两个属性定义的新匿名对象分组(这是使用new关键字的地方),创建别名dist,然后取第一个,基本上丢弃其余的