理解LINQ和lambda的两个方法

本文关键字:两个 方法 LINQ lambda 理解 | 更新日期: 2023-09-27 17:50:44

我有一个问题,我和我的朋友正在做代码,他做了两个方法,我不完全理解。

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"字的片段)?

理解LINQ和lambda的两个方法

new字的部分是如何在匿名类型上定义实例。

匿名类型提供了一种方便的方法,可以将一组只读属性封装到单个对象中,而不必先显式地定义类型。类型名称由编译器生成,在源代码级别不可用。每个属性的类型由编译器推断。

通过使用new操作符和对象初始化器来创建匿名类型。有关对象初始化器的更多信息,请参见对象和集合初始化器(c#编程指南)。

作为旁注,您的查询是等效的,因为编译器会将第一个转换为第二个作为编译过程的一部分。在MSDN上阅读更多内容:LINQ (c#)中的查询语法和方法语法

介绍性语言集成查询(LINQ)文档中的大多数查询都是使用LINQ声明性查询语法编写的。但是,在编译代码时,必须将查询语法转换为. net公共语言运行时(CLR)的方法调用。这些方法调用调用标准查询操作符,其名称为Where, Select, GroupBy, Join, MaxAverage。您可以通过使用方法语法而不是查询语法直接调用它们。

函数从输入列表中获取不同项的列表,其中ReaderAccessor和BookAccessor确定相等性。输入列表中的重复项将被丢弃。

它们的工作原理是按两个属性定义的新匿名对象分组(这是使用new关键字的地方),创建别名dist,然后取第一个,基本上丢弃其余的