关于c#:从另一个列表中删除项目

Remove items from one list in another

我正在试图找出如何遍历一个通用的项目列表,我想从另一个项目列表中删除这些项目。

所以假设我有一个假设的例子

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

我想用foreach遍历列表1,并删除列表1中也包含在列表2中的每个项。

我不太确定该怎么做,因为foreach不是基于索引的。


您可以使用,除了:

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

您可能甚至不需要这些临时变量:

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

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


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

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


我建议使用LINQ扩展方法。你可以用这样的一行代码很容易做到:

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

这当然是假设您要从列表2中删除的列表1中的对象是相同的实例。


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

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

最适合我的情况。我需要加载一个没有已注册记录的DropDownlist。

谢谢您!!!!

这是我的代码:

1
2
3
4
5
6
7
8
9
10
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();

你可以使用linq,但我会使用RemoveAll方法。我认为这是一个更好地表达你的意图。

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

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

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


1
list1.RemoveAll(l => list2.Contains(l));


解决方案1:您可以这样做:

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

但在某些情况下,这种解决方案可能不起作用。如果它不起作用,你可以使用我的第二个解决方案。

解决方案2:

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

我们假设list1是您的主列表,list2是您的第二个列表,并且您希望得到不包含list2项的list1项。

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

来吧…

1
2
3
4
5
6
7
8
9
10
    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);
            }
        });