【问题标题】:May someone convert following linq query syntax into method syntax using lambda?有人可以使用 lambda 将以下 linq 查询语法转换为方法语法吗?
【发布时间】:2018-05-17 16:23:14
【问题描述】:
IList<Student> studentList = new List<Student>() { 
        new Student() { StudentID = 1, StudentName = "John", Age = 18, StandardID = 1 } ,
            new Student() { StudentID = 2, StudentName = "Steve",  Age = 21, StandardID = 1 } ,
            new Student() { StudentID = 3, StudentName = "Bill",  Age = 18, StandardID = 2 } ,
            new Student() { StudentID = 4, StudentName = "Ram" , Age = 20, StandardID = 2 } ,
            new Student() { StudentID = 5, StudentName = "Ron" , Age = 21 } 
    };

    IList<Standard> standardList = new List<Standard>() { 
        new Standard(){ StandardID = 1, StandardName="Standard 1"},
        new Standard(){ StandardID = 2, StandardName="Standard 2"},
        new Standard(){ StandardID = 3, StandardName="Standard 3"}
    };

    var studentsWithStandard = from stad in standardList
                       join s in studentList
                       on stad.StandardID equals s.StandardID
                       into sg
                           from std_grp in sg 
                           orderby stad.StandardName, std_grp.StudentName 
                           select new { 
                                            StudentName = std_grp.StudentName, 
                                            StandardName = stad.StandardName 
                            };

foreach (var group in studentsWithStandard)
    {
        Console.WriteLine("{0} is in {1}", group.StudentName, group.StandardName);
    }

我试过了。我的代码如下。

 var studentsWithStandard  = standardList.GroupJoin(studentList, stand => stand.StandardID, s => s.StandardID,
            (stand, students) => new {StandardName = stand.StandardName, studentGroup = students}).OrderBy(an => an.StandardName);

输出将是这样的:

John is in Standard 1
Steve is in Standard 1
Bill is in Standard 2
Ram is in Standard 2

我从http://www.tutorialsteacher.com/codeeditor?cid=cs-JUmITE 得到的 提前致谢。

【问题讨论】:

  • 为什么要将可读的 LINQ 查询转换为不可读的?对于Join,我绝对更喜欢查询语法
  • 我没有得到答案。只获得反对票。提问算不算犯罪?为什么我会得到反对票?

标签: c# linq lambda


【解决方案1】:

根据我的经验,join 是查询语法比 lambda 语法更具可读性的一个地方,但无论如何...

我强烈推荐阅读 Jon Skeet 的优秀书籍 C# In Depth。 LINQ 的章节非常清楚地解释了各种查询语法的含义。 https://www.manning.com/books/c-sharp-in-depth-third-edition

只有一个fromjoin 表达式将转换为Join 方法,而不是GroupJoinGroupJoinjoin 之前有两个froms 时使用。

你会希望它做一个内部连接:

standardList
    .Join(studentList,
        stad => stad.StandardID,
        s => s.StandardID,
        (stad, s) => new { Standard = stad, Student = s })
    .OrderBy(x => x.Standard.StandardName)
    .ThenBy(x => x.Student.StudentName)

【讨论】:

  • 他的查询中有两个from,但不需要得到他的答案。你也离开了Select
  • Join的最后一个参数基本上是一个Select
  • 哦,抱歉,我没注意到。不错!
【解决方案2】:

您可以这样翻译查询:

var ans = standardList.Join(studentList, stad => stad.StandardID, s => s.StandardID, (stad, s) => new { stad, s })
                      .OrderBy(stads => stads.stad.StandardName).ThenBy(stads => stads.s.StudentName)
                      .Select(stads => new { stads.s.StudentName, stads.stad.StandardName });

请注意,@JamesFaix 的答案提供了一个更有效的较少文字版本,它结合了 JoinSelect

这实际上是没有into 的查询理解版本,您的查询不需要它:

var studentsWithStandard = from stad in standardList
                           join s in studentList on stad.StandardID equals s.StandardID
                           orderby stad.StandardName, s.StudentName
                           select new {
                               StudentName = s.StudentName,
                               StandardName = stad.StandardName
                           };

请注意,您的查询的严格翻译将涉及GroupJoin/SelectMany,但这不是必需的,因为您没有尝试进行左连接:

var ans2 = standardList.GroupJoin(studentList, stad => stad.StandardID, s => s.StandardID, (stad, sg) => new { stad, sg })
                       .SelectMany(stadsg => stadsg.sg.Select(s => new { stadsg.stad, s }))
                       .OrderBy(stads => stads.stad.StandardName).ThenBy(stads => stads.s.StudentName)
                       .Select(stads => new { stads.s.StudentName, stads.stad.StandardName });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-15
    • 2021-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多