Предполагая, что ваш 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