C# 比较两个列表并删除同一项

C# 比较两个列表并删除同一项,c#,list,C#,List,使用foreach,我想循环浏览两个不同的列表,找到相同的ID,然后删除该项 例如: IList<Student> studentList1 = new List<Student> { new Student() { StudentID = 1, StudentName = "John" }, new Student() { StudentID = 2, StudentName = "Steve" }, new Student() { Stud

使用
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" } 
};
IList studentList1=新列表
{ 
new Student(){StudentID=1,StudentName=“John”},
new Student(){StudentID=2,StudentName=“Steve”},
new Student(){StudentID=3,StudentName=“Bill”}
};
IList studentList2=新列表
{                    
new Student(){StudentID=3,StudentName=“Bill”},
new Student(){StudentID=4,StudentName=“Ram”},
新学生(){StudentID=5,StudentName=“Ron”}
};

我如何在
studentList1
studentList2
之间循环,然后删除studentList2中
StudentID=3
的对象?

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

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

    public string StudentName { get; set; }

    public override string ToString()
    {
        return $"StudentID={StudentID} StudentName={StudentName}";
    }
}
您可以从
系统使用和。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)。一种改进是将第一个列表中的ID存储到
哈希集中,然后使用O(1)进行查找,而不是使用:


假设您的
学生
类声明如下:

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

    public string StudentName { get; set; }

    public override string ToString()
    {
        return $"StudentID={StudentID} StudentName={StudentName}";
    }
}
您可以从
系统使用和。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)。一种改进是将第一个列表中的ID存储到
哈希集中,然后使用O(1)进行查找,而不是使用:



您可以使用LINQ方法
Where
,或方法
删除
列表中的
请具体
然后删除该项目
从两个列表或一个列表中删除该项目,或选择我们的最爱对不起,从StudentList2中删除该项目有办法用于每个循环吗?您可以使用LINQ方法
Where
,或者方法
删除
列表的
请明确
然后删除该项目
从两个列表或一个列表中删除该项目,或者选择我们的最爱抱歉,从StudentList2中删除该项目有办法使用每个循环吗?谢谢。但是我刚刚意识到我不能使用linq,因为这两个列表没有使用相同的对象模式。有没有办法使用foreach循环?再次感谢您的修改。。但是,这次使用HashSet时,我遇到了错误:“无法从System.Collections.Generic.iEnumerable转换为System.Collections.Generic.IEqualityComparer”。Id实际上被设置为int?因为可以为null。我是这样声明的:public int?StudentID{get;set;}@ichachan不用担心,我修改了代码,改为使用nullable
int?
。我不确定,但是如果需要删除两个项目,这段代码似乎会失败,因为您正在使用索引访问列表成员并将其从同一列表中删除。从最后一个迭代到第一个将解决这个问题。编辑@SebastianSchumann我感谢你的编辑,错过了那一个:谢谢。但是我刚刚意识到我不能使用linq,因为这两个列表没有使用相同的对象模式。有没有办法使用foreach循环?再次感谢您的修改。。但是,这次使用HashSet时,我遇到了错误:“无法从System.Collections.Generic.iEnumerable转换为System.Collections.Generic.IEqualityComparer”。Id实际上被设置为int?因为可以为null。我是这样声明的:public int?StudentID{get;set;}@ichachan不用担心,我修改了代码,改为使用nullable
int?
。我不确定,但是如果需要删除两个项目,这段代码似乎会失败,因为您正在使用索引访问列表成员并将其从同一列表中删除。从最后一个迭代到第一个将解决这个问题。编辑@SebastianSchumann我很感激你的编辑,错过了那一个:P