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