我试图弄清楚如何遍历一个我想从另一个项目列表中删除的项目的通用列表。
假设这是一个假设的例子
List<car> list1 = GetTheList();
List<car> list2 = GetSomeOtherList();
我想用foreach遍历list1,并删除list1中的每个项目,这也包含在List2中。
我不太确定如何去做,因为foreach不是基于索引的。
我试图弄清楚如何遍历一个我想从另一个项目列表中删除的项目的通用列表。
假设这是一个假设的例子
List<car> list1 = GetTheList();
List<car> list2 = GetSomeOtherList();
我想用foreach遍历list1,并删除list1中的每个项目,这也包含在List2中。
我不太确定如何去做,因为foreach不是基于索引的。
当前回答
我建议使用LINQ扩展方法。你可以用一行代码轻松完成,如下所示:
list2 = list2.Except(list1).ToList();
当然,这是假设您要从list2中删除的list1中的对象是相同的实例。
其他回答
您不需要索引,因为List<T>类允许您使用remove函数按值而不是按索引删除项。
foreach(car item in list1) list2.Remove(item);
因为Except不修改列表,你可以在list <T>上使用ForEach:
list2.ForEach(item => list1.Remove(item));
这可能不是最有效的方法,但它简单,因此可读,并且它更新原始列表(这是我的要求)。
你可以使用Except:
List<car> list1 = GetTheList();
List<car> list2 = GetSomeOtherList();
List<car> result = list2.Except(list1).ToList();
你可能根本不需要这些临时变量:
List<car> result = GetSomeOtherList().Except(GetTheList()).ToList();
注意,Except不会修改任何一个列表——它会用结果创建一个新的列表。
解决方案1:你可以这样做:
List<car> result = GetSomeOtherList().Except(GetTheList()).ToList();
但在某些情况下,这种解决方案可能行不通。如果不行,你可以用我的第二个解决方案。
解决方案二:
List<car> list1 = GetTheList();
List<car> list2 = GetSomeOtherList();
我们假设list1是你的主列表,list2是你的副列表,你想要得到list1的项而不是list2的项。
var result = list1.Where(p => !list2.Any(x => x.ID == p.ID && x.property1 == p.property1)).ToList();
我建议使用LINQ扩展方法。你可以用一行代码轻松完成,如下所示:
list2 = list2.Except(list1).ToList();
当然,这是假设您要从list2中删除的list1中的对象是相同的实例。