理解LINQ和lambda的两种方法

时间:2015-05-24 18:12:42

标签: c# linq lambda

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

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

2 个答案:

答案 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}},WhereSelectGroupByJoinMax。您可以使用方法语法而不是查询语法直接调用它们。

答案 1 :(得分:0)

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

他们通过按两个属性定义的新匿名对象进行分组(这是使用new关键字的位置),创建一个别名 dist ,然后取第一个,基本上丢弃其余部分。

相关问题