从另一个列表中删除项目

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

所以我们假设这是一个假设的例子

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(); 

你可能甚至不需要这些临时variables:

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

请注意, Except不修改任何列表 – 它创build一个新的列表与结果。

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

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

我会build议使用LINQ扩展方法 。 你可以很容易地用一行代码来做到这一点:

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

这当然假设list1中从list2中移除的对象是同一个实例。

你可以使用LINQ,但我会去与RemoveAll方法。 我认为那是更好地expression你意图的那个。

 var integers = new List<int> { 1, 2, 3, 4, 5 }; var remove = new List<int> { 1, 3, 5 }; integers.RemoveAll(i => remove.Contains(i)); 

在我的情况下,我有两个不同的名单,有一个共同的标识符,有点像一个外键。 “nzrytmn”引用的第二个解决scheme:

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

是最适合我的情况。 我需要加载一个DropDownList没有logging已经被注册。

谢谢 !!!

这是我的代码:

 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(); 

解决scheme1:你可以这样做:

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

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

解决scheme2:

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

我们假设list1是你的主要列表,list2是你的secondry列表,你想得到list1的项目,而没有list2的项目。

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

这里你去..

  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); } });