使用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<>