在一个列表中查找元素,而在另一个列表中不查找

本文关键字:查找 列表 另一个 元素 一个 | 更新日期: 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检查peopleList1peopleList2对应的元素,并产生一个结果序列,该序列是peopleList1中存在而peopleList2中不存在的元素,其顺序完全相同。

应该这样做

peopleList1.Where(x=>peopleList2.Count<peopleList1.IndexOf(x)+1||peopleList2[peopleList1.IndexOf(x)].ID!=x.ID).ToList()