Сравните два списка и удалите один и тот же элемент - PullRequest
0 голосов
/ 07 мая 2019

Используя foreach, я хочу просмотреть два разных списка и найти один и тот же идентификатор, а затем удалить этот элемент.

Например:

IList<Student> studentList1 = new List<Student> 
{ 
    new Student() { StudentID = 1, StudentName = "John" },
    new Student() { StudentID = 2, StudentName = "Steve" },
    new Student() { StudentID = 3, StudentName = "Bill" } 
};

IList<Student> studentList2 = new List<Student> 
{                    
    new Student() { StudentID = 3, StudentName = "Bill" },
    new Student() { StudentID = 4, StudentName = "Ram" },
    new Student() { StudentID = 5, StudentName = "Ron" } 
};

Как пройти черези studentList1 и studentList2, а затем удалите объект в studentList2, где StudentID = 3?

1 Ответ

2 голосов
/ 07 мая 2019

Предполагая, что ваш Student класс объявил что-то вроде этого:

public class Student
{
    public int? StudentID { get; set; }

    public string StudentName { get; set; }

    public override string ToString()
    {
        return $"StudentID={StudentID} StudentName={StudentName}";
    }
}

Вы можете использовать Where() и Any() из System.Linq:

var removedList2 = studentList2
    .Where(s2 => !studentList1
    .Any(s1 => s1.StudentID == s2.StudentID));

foreach (var student in removedList2)
{
    Console.WriteLine(student);
}
// StudentID=4 StudentName=Ram
// StudentID=5 StudentName=Ron

Однако вышеприведенное довольно неэффективно, так как вам нужно сканировать весь первый список для поиска, который равен O (N). Улучшение будет заключаться в том, чтобы хранить идентификаторы из первого списка в HashSet<int?>, тогда вместо поиска используется O (1) вместо Contains():

var ids = new HashSet<int?>(studentList1.Select(s1 => s1.StudentID));

var removedList2 = studentList2.Where(s2 => !ids.Contains(s2.StudentID));

foreach (var student in removedList2)
{
    Console.WriteLine(student);
}
// StudentID=4 StudentName=Ram
// StudentID=5 StudentName=Ron

С помощью только циклов foreach вы можете использовать Remove():

var ids = new HashSet<int?>();
foreach (var s1 in studentList1)
{
    ids.Add(s1.StudentID);
}

for (var i = studentList2.Count - 1; i >= 0; --i)
{
    if (ids.Contains(studentList2[i].StudentID))
    {
        studentList2.Remove(studentList2[i]);
    }
}

foreach (var student in studentList2)
{
    Console.WriteLine(student);
}
// StudentID=4 StudentName=Ram
// StudentID=5 StudentName=Ron
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...