我试图弄清楚如何遍历一个我想从另一个项目列表中删除的项目的通用列表。

假设这是一个假设的例子

List<car> list1 = GetTheList();
List<car> list2 = GetSomeOtherList();

我想用foreach遍历list1,并删除list1中的每个项目,这也包含在List2中。

我不太确定如何去做,因为foreach不是基于索引的。


当前回答

你可以使用Except:

List<car> list1 = GetTheList();
List<car> list2 = GetSomeOtherList();
List<car> result = list2.Except(list1).ToList();

你可能根本不需要这些临时变量:

List<car> result = GetSomeOtherList().Except(GetTheList()).ToList();

注意,Except不会修改任何一个列表——它会用结果创建一个新的列表。

其他回答

我认为将列表A转换为字典,然后对第二个列表进行foreach,并调用DictA.Remove(item),否则我认为大多数解决方案都会直接或隐藏地通过列表A进行多次迭代。

如果列表很小,这可能没有关系。

给你…

    List<string> list = new List<string>() { "1", "2", "3" };
    List<string> remove = new List<string>() { "2" };

    list.ForEach(s =>
        {
            if (remove.Contains(s))
            {
                list.Remove(s);
            }
        });

我建议使用LINQ扩展方法。你可以用一行代码轻松完成,如下所示:

list2 = list2.Except(list1).ToList();

当然,这是假设您要从list2中删除的list1中的对象是相同的实例。

你可以使用Except:

List<car> list1 = GetTheList();
List<car> list2 = GetSomeOtherList();
List<car> result = list2.Except(list1).ToList();

你可能根本不需要这些临时变量:

List<car> result = GetSomeOtherList().Except(GetTheList()).ToList();

注意,Except不会修改任何一个列表——它会用结果创建一个新的列表。

您不需要索引,因为List<T>类允许您使用remove函数按值而不是按索引删除项。

foreach(car item in list1) list2.Remove(item);