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

假设这是一个假设的例子

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

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

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


当前回答

解决方案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();

其他回答

在我的例子中,我有两个不同的列表,使用一个通用标识符,有点像外键。 “nzrytmn”引用的第二个解决方案:

var result =  list1.Where(p => !list2.Any(x => x.ID == p.ID && x.property1 == p.property1)).ToList();

最适合我的情况。 我需要加载一个下拉列表,没有已经注册的记录。

谢谢!!

这是我的代码:

t1 = new T1();
t2 = new T2();

List<T1> list1 = t1.getList();
List<T2> list2 = t2.getList();

ddlT3.DataSource= list2.Where(s => !list1.Any(p => p.Id == s.ID)).ToList();
ddlT3.DataTextField = "AnyThing";
ddlT3.DataValueField = "IdAnyThing";
ddlT3.DataBind();

解决方案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,但我会使用RemoveAll方法。我觉得这个更能表达你的意图。

var integers = new List<int> { 1, 2, 3, 4, 5 };

var remove = new List<int> { 1, 3, 5 };

integers.RemoveAll(i => remove.Contains(i));

给你…

    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);
            }
        });
list1.RemoveAll(l => list2.Contains(l));