一尘不染

使用LINQ来获取一个List <>中的项目,而不是另一个List <>中的项目

c#

我会假设有一个简单的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 = 1 });
        peopleList2.Add(new Person() { ID = 2 });
        peopleList2.Add(new Person() { ID = 3 });
        peopleList2.Add(new Person() { ID = 4 });
        peopleList2.Add(new Person() { ID = 5 });
    }
}

class Person
{
    public int ID { get; set; }
}

我想执行LINQ查询,以使所有peopleList2不在这里的人都进入我的视野peopleList1

这个例子应该给我两个人(ID = 4&ID = 5)


阅读 330

收藏
2020-05-19

共1个答案

一尘不染

可以使用以下LINQ表达式解决此问题:

var result = peopleList2.Where(p => !peopleList1.Any(p2 => p2.ID == p.ID));

通过LINQ表示这种情况的另一种方法,一些开发人员发现它更具可读性:

var result = peopleList2.Where(p => peopleList1.All(p2 => p2.ID != p.ID));

警告: 如评论中所述,这些方法要求执行 O(n * m)
操作。可能不错,但可能会带来性能问题,尤其是在数据集很大的情况下。如果这不能满足您的性能要求,则可能需要评估其他选项。由于陈述的要求是针对LINQ中的解决方案,因此,这里不探讨这些选项。与往常一样,根据您的项目可能具有的性能要求评估任何方法。

2020-05-19