我正在试图弄清楚如何遍历我要从其他项目列表中删除的项目的通用列表。
所以我想说这是一个假设的例子
List<car> list1 = GetTheList();
List<car> list2 = GetSomeOtherList();
我想用foreach遍历list1并删除List1中也包含在List2中的每个项目。
我不太确定如何去做,因为foreach不是基于索引的。
答案 0 :(得分:304)
您可以使用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 :(得分:31)
您不需要索引,因为List<T>
类允许您使用Remove
函数按值而不是索引删除项目。
foreach(car item in list1) list2.Remove(item);
答案 2 :(得分:22)
我建议使用LINQ extension methods。您可以使用一行代码轻松完成此操作:
list2 = list2.Except(list1).ToList();
当然,假设您从list2中删除的list1中的对象是同一个实例。
答案 3 :(得分:14)
在我的情况下,我有两个不同的列表,带有一个公共标识符,有点像外键。 &#34; nzrytmn&#34; 引用的第二个解决方案:
var result = list1.Where(p => !list2.Any(x => x.ID == p.ID && x.property1 == p.property1)).ToList();
那个最符合我情况的那个。 我需要加载一个没有已经注册的记录的DropDownList。
谢谢!!!
这是我的代码:
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();
答案 4 :(得分:13)
您可以使用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));
答案 5 :(得分:10)
list1.RemoveAll(l => list2.Contains(l));
答案 6 :(得分:5)
解决方案1:您可以这样做:
List<car> result = GetSomeOtherList().Except(GetTheList()).ToList();
但在某些情况下,此解决方案可能无效。如果它不起作用,你可以使用我的第二个解决方案。
解决方案2:
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();
答案 7 :(得分:0)
由于Except
不会修改列表,因此可以在List<T>
上使用ForEach:
list2.ForEach(item => list1.Remove(item));
这可能不是最有效的方法,但是它很简单,因此易读,并且会更新原始列表(这是我的要求)。
答案 8 :(得分:-4)
这里你去..
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);
}
});