我想使用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" }
};
如何循环遍历studentList1
和studentList2
,然后在StudentList2中StudentID = 3
的位置删除对象?
答案 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