我正在尝试弄清楚如何遍历一个通用的项目列表,并从另一个项目列表中删除它们。
假设我有以下假想例子:
List<car> list1 = GetTheList();
List<car> list2 = GetSomeOtherList();
我想用foreach遍历List1,然后移除List2中包含的每个List1中的元素。但是因为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
不会修改任何一个列表 - 它会创建一个新的列表并返回结果。IEnumerable<car>
,而不是List<car>
。你需要调用ToList()
来获取一个列表。此外,我认为应该是GetSomeOtherList().Except(GetTheList()).ToList()
。 - Adam RobinsonSystem.Linq
,则还需要添加using System.Linq;
。 - yellavonExcept
时要小心,因为它实际上执行的是集合操作,会使结果列表去重。由于我正在使用的是List
而不是HashSet
,所以我没有预料到这种行为。[相关链接](https://dev59.com/CHA85IYBdhLWcg3wBO7h) - logan你不需要索引,因为List<T>
类允许您通过使用Remove
函数按值而不是索引来删除项目。
foreach(car item in list1) list2.Remove(item);
list1.ForEach(c => list2.Remove(c));
- David Sherretvar 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();
我建议使用LINQ扩展方法。您可以轻松地用一行代码完成它,如下所示:
list2 = list2.Except(list1).ToList();
当然前提是list1中要移除的对象与list2中的是同一个实例。
list1.RemoveAll(l => list2.Contains(l));
O(N)
,这将导致O(N^2)
,对于大型列表可能会成为一个问题。 - tigrouRemoveAll
方法。我认为这个方法更能表达你的意图。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:您可以这样做:
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();
由于Except
不会修改列表,因此您可以在List<T>
上使用ForEach:
list2.ForEach(item => list1.Remove(item));
这可能不是最高效的方法,但它很简单易懂,而且可以更新原始列表(这是我的要求)。
我认为将列表A转换为字典,然后对第二个列表进行foreach循环并调用DictA.Remove(item)
会更快,否则我认为大多数解决方案都会直接或间接地导致对列表A进行多次迭代。
如果列表很小,那么这可能无关紧要。
如果您有两个具有不同数据模型的列表
List<FeedbackQuestionsModel> feedbackQuestionsList = new();
List<EmployeesFeedbacksQuestionsModel> employeeQuestionsList = new();
var resultList = feedbackQuestionsList.Where(p => !employeeQuestionsList.Any(x => x.Question == p.Question)).ToList();
feedbackQuestionsList = resultList.ToList();
list1
中删除存在于list2
中的项目,还是想要从list2
中删除存在于list1
中的项目?在本评论编写时,提供的每个答案都将执行后者操作。 - John Rasch