使用LINQ获取一个List <>中不在另一个List <>中的项目

我会假设有一个简单的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)


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

如果你重写人的平等,那么你也可以使用:

peopleList2.Except(peopleList1)

因为它可以将第二个列表放入散列表中, Except应该比Where(...Any)更快。 Where(...Any)的运行时间为O(peopleList1.Count * peopleList2.Count)而基于HashSet<T> (几乎)的变体的运行时间为O(peopleList1.Count + peopleList2.Count)

Except隐式删除重复。 这不应该影响你的情况,但可能是类似情况下的问题。

或者,如果你想要快速的代码,但不想覆盖相等:

var excludedIDs = new HashSet<int>(peopleList1.Select(p => p.ID));
var result = peopleList2.Where(p => !excludedIDs.Contains(p.ID));

此变体不会删除重复项。


或者如果你想要它没有否定:

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

基本上它说从peopleList2中获取所有人,其中peopleList1中的所有id与peoplesList2中的id不同。

只是从接受的答案一点点不同的方法:)

链接地址: http://www.djcxy.com/p/51369.html

上一篇: Use LINQ to get items in one List<>, that are not in another List<>

下一篇: Multiple Order By with LINQ