比较两个列表并删除相同的项目

时间:2019-05-07 03:17:28

标签: c# list

我想使用foreach遍历两个不同的列表并找到相同的ID,然后删除该项目。

例如:

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

如何循环遍历studentList1studentList2,然后在StudentList2中StudentID = 3的位置删除对象?

1 个答案:

答案 0 :(得分:2)

假设您的Student类声明了以下内容:

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

    public string StudentName { get; set; }

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

您可以使用System.Linq中的Where()Any()

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),因此上述操作效率很低。一种改进是将第一个列表中的id存储到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