Конвертировать лямбда-выражение в linq c # - PullRequest
0 голосов
/ 21 мая 2018

, поэтому у меня есть этот код, написанный с помощью foreaches, и я должен использовать объявление программирования с помощью linq.У меня вопрос, как это должно выглядеть в linq?У меня есть пара примеров, но они бесполезны в моем случае

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;
            }
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Теперь работает, я использовал этот код.

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

    return studentListBySelectedLecturer;
0 голосов
/ 21 мая 2018

Я думаю, что пример, который вы пытаетесь, не работает, потому что он возвращает IEnumerable<Student>, а ваш метод должен возвращать 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;
}

Другим способом было бы преобразование возвращаемого значения в 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();
}

Конечно, все еще существуют некоторые потенциальные проблемы, такие какесли linkedList или lecturer равен null, или если в text нет пробела (вы получите IndexOutOfRangeException при попытке доступа к индексу 1).Кроме того, вы можете использовать метод Contains в массиве имен лекторов, чтобы упростить ваше where условие:

Вы можете решить эти проблемы, выполнив что-то вроде:

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...