Linq лямбда для поиска списка в списке, поиска соответствия, а затем удаления его из списка - PullRequest
1 голос
/ 16 июня 2011

Я пытаюсь изучить Linq, и мне нужна помощь с методом, который ищет Список в Списке, находит совпадение и удаляет его.Например, представьте, что у меня есть класс с именем Student:

public class Student
{
   string FirstName;
   string LastName;
}

Затем представьте, что у меня есть другой класс с именем Classroom, который имеет List<Student>:

public class Classroom
{
   List<Student> Students;
}

Инаконец, у меня есть еще один класс, называемый School, который имеет список Classrooms:

public class School
{
   List<Classroom> Classrooms;
}

Затем мне нужен метод, который принимает объект Student, проверяет, есть лиученик учится в школе и удаляет их, если они есть.Если они в школе, метод должен удалить их и вернуть true.Если они не в школе, метод должен вернуть false и не предпринимать никаких действий.Вот пример использования циклов foreach, от которого я хочу избавиться:

public bool RemoveStudentFromSchool(Student student)
{
   foreach (Classroom c in Classrooms)
   {
      foreach (Student s in c.Students)
      {
         if ((student.FirstName == s.FirstName) && (student.LastName == s.LastName))
         {
            s.Remove(student);

            return true;
         }
      }
   }

   return false;
}

Ответы [ 2 ]

3 голосов
/ 16 июня 2011

Предполагается, что студент может находиться только в одной комнате, а Student равно IEquatable по имени и фамилии (или ссылки равны):

var roomWithStudent = Classrooms.FirstOrDefault(c => c.Students.Any(s => s.Equals(student));
if (roomWithStudent != null)
{
    roomWithStudent.Remove(student);
    return true;
}
return false;

Альтернативный подход, если Student не IEquatable и переданный объект поиска не обязательно является той же ссылкой:

var roomWithStudent = Classrooms
                        .SelectMany(c => c.Students.Select(s => new { Room = c, Student = s }))
                        .Where(rs => (student.FirstName == rs.Student.FirstName) && (student.LastName == rs.Student.LastName))
                        .FirstOrDefault();

if (roomWithStudent != null)
{
    roomWithStudent.Room.Students.Remove(roomWithStudent.Student);
    return true;
}
return false;
1 голос
/ 16 июня 2011

Как насчет метода расширения ..

public static bool RemoveFromRoom(this Student student,School school)
{
    if (student == null) throw new ArgumentNullException("student");
    if (school == null) throw new ArgumentNullException("school");
    bool ret = false;
    var room = school.Classrooms.SingleOrDefault(cr=>cr.Students.Contains(student));
    if (room !=null)
    {
        ret = true;
        room.Students.Remove(student);
    }

    return ret;
}

Использование

student.RemoveFromRoom(instanceOfSchool);

Или ...

public static bool RemoveStudentFromRoom(this School school,Student student)
{
    if (student == null) throw new ArgumentNullException("student");
    if (school == null) throw new ArgumentNullException("school");
    bool ret = false;
    var room = school.Classrooms.SingleOrDefault(cr=>cr.Students.Contains(student));
    if (room !=null)
    {
        ret = true;
        room.Students.Remove(student);
    }

    return ret;
}

Использование

instanceOfSchool.RemoveStudentFromRoom(student);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...