在一个列表中查找元素,而在另一个列表中不查找
本文关键字:查找 列表 另一个 元素 一个 | 更新日期: 2023-09-27 18:13:25
我假设有一个简单的LINQ查询来做到这一点,我只是不完全确定如何。请参阅下面的代码片段,注释解释了我想做的事情:
class Program
{
static void Main(string[] args)
{
List<Person> peopleList1 = new List<Person>();
peopleList1.Add(new Person() { ID = 1 });
peopleList1.Add(new Person() { ID = 2 });
peopleList1.Add(new Person() { ID = 3 });
List<Person> peopleList2 = new List<Person>();
peopleList2.Add(new Person() { ID = 2 });
peopleList2.Add(new Person() { ID = 1 });
peopleList2.Add(new Person() { ID = 4 });
peopleList2.Add(new Person() { ID = 3 });
peopleList2.Add(new Person() { ID = 5 });
}
}
我想执行一个LINQ查询,以在完全相同的顺序中给出peopleList1
中不在peopleList2
中的所有人。这个例子应该给我三个人:
(ID = 1, 2, 3)
我试过使用
peopleList1.Except(peopleList2)
但这在我的场景中不起作用,因为我还必须检查订单。列表1应该包含与列表2完全相同位置的元素
在。net中,List<T>
类型由数组支持,因此使用LINQ执行此操作的最有效方法是使用也访问索引的Select
的过载:
peopleList1.Where((person, index) => peopleList2[index].Id != person.Id);
我认为这应该是你想要的:
var result = peopleList1.Zip(peopleList2, (f, s) => f.ID != s.ID ? f.ID : 0)
.Where(c => c > 0).ToList();
Zip
检查peopleList1
和peopleList2
对应的元素,并产生一个结果序列,该序列是peopleList1
中存在而peopleList2
中不存在的元素,其顺序完全相同。
应该这样做
peopleList1.Where(x=>peopleList2.Count<peopleList1.IndexOf(x)+1||peopleList2[peopleList1.IndexOf(x)].ID!=x.ID).ToList()