首页 > 解决方案 > 将 lambda 表达式转换为 linq c#

问题描述

我有学生名单和讲师名单,我用双 foreach 语句编写了代码。

有什么方法可以使用 Lambda 表达式简化此代码?

public void GetLecturersWorkloadStatistics(List<Student> studentList, List<Lecturer> lecturerList)
{
    foreach (Lecturer lecturer in lecturerList)
    {
        foreach (Student student in studentList)
        {
            if (lecturer.ModuleName == student.ModuleName && lecturer.LastName == student.LecturerLastName &&
                lecturer.FirstName == student.LecturerFirstName)
            {
                lecturer.Credits = lecturer.Credits + lecturer.ModuleValueInCredits;
            }
        }
    }
}

标签: c#linqlambda

解决方案


我认为您尝试的示例不起作用,因为它返回 anIEnumerable<Student>并且您的方法应该返回 a List<Student>;

您还缺少将&&子句组合在一起所需的一些括号,因此它们由||运算符分隔。

解决此问题的一种方法是将方法的返回类型更改为,并在子句IEnumerable<Student>周围添加一些括号:&&

public IEnumerable<Student> GetStudentBySelectedLecturer(List<Student> linkedList,
    string text)
{
    var lecturerInformation = text.Split(' ');

    return from stud in linkedList
        where (stud.LecturerFirstName == lecturerInformation[0] &&
                stud.LecturerLastName == lecturerInformation[1]) ||
                (stud.LecturerFirstName == lecturerInformation[1] &&
                stud.LecturerLastName == lecturerInformation[0])
        select stud;
}

另一种方法是将返回值转换为 a List<Student>

public List<Student> GetStudentBySelectedLecturer(List<Student> linkedList,
    string text)
{
    var lecturerInformation = text.Split(' ');

    return (from stud in linkedList
        where (stud.LecturerFirstName == lecturerInformation[0] &&
               stud.LecturerLastName == lecturerInformation[1]) ||
              (stud.LecturerFirstName == lecturerInformation[1] &&
               stud.LecturerLastName == lecturerInformation[0])
        select stud).ToList();
}

当然还有一些潜在的问题,比如 iflinkedList或者lectureris null,或者里面没有空格(当你试图访问 index 时text你会得到一个)。此外,您可以使用讲师姓名数组上的方法来简化您的条件:IndexOutOfRangeException1Containswhere

您可以通过执行以下操作来解决这些问题:

public IEnumerable<Student> GetStudentBySelectedLecturer(List<Student> students,
    string lecturer)
{
    if (students == null || lecturer == null) return null;

    var lecturerName = lecturer.Split(' ');

    return from student in students
        where lecturerName.Contains(student.LecturerFirstName) &&
              lecturerName.Contains(student.LecturerLastName)
        select student;
}

推荐阅读