我有一个问题,我的朋友和我正在做代码,他做了两种我不太理解的方法。
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'字样的片段)?
答案 0 :(得分:3)
new
字的部分是您在Anonymous Types上定义实例的方式。
匿名类型提供了一种将一组只读属性封装到单个对象中的便捷方法,而无需先显式定义类型。类型名称由编译器生成,在源代码级别不可用。每个属性的类型由编译器推断。
您可以使用
new
运算符和对象初始值设定项创建匿名类型。有关对象初始值设定项的详细信息,请参阅Object and Collection Initializers (C# Programming Guide)。
作为旁注,您的查询是等效的,因为编译器会在编译过程中将第一个转换为第二个。在MSDN上阅读有关该内容的更多信息:Query Syntax and Method Syntax in LINQ (C#)
介绍性语言集成查询(LINQ)文档中的大多数查询都是使用LINQ声明性查询语法编写的。但是,在编译代码时,必须将查询语法转换为.NET公共语言运行库(CLR)的方法调用。这些方法调用调用标准查询运算符,其名称如{{ 1}},
Where
,Select
,GroupBy
,Join
和Max
。您可以使用方法语法而不是查询语法直接调用它们。
答案 1 :(得分:0)
这些函数从输入列表中获取不同项的列表,其中ReaderAccessor和BookAccessor确定相等性。输入列表中的重复项目将被丢弃。
他们通过按两个属性定义的新匿名对象进行分组(这是使用new关键字的位置),创建一个别名 dist ,然后取第一个,基本上丢弃其余部分。