我会假设有一个简单的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)
9 回答
如果覆盖People的相等性,那么您也可以使用:
Except
应该明显快于Where(...Any)
变体,因为它可以将第二个列表放入哈希表中 .Where(...Any)
的运行时间为O(peopleList1.Count * peopleList2.Count)
,而基于HashSet<T>
(几乎)的变体的运行时间为O(peopleList1.Count + peopleList2.Count)
.Except
隐式删除重复项 . 这不应该影响你的情况,但可能是类似案件的问题 .或者,如果您想要快速代码但又不想覆盖相等性:
此变体不会删除重复项 .
或者,如果你想要它没有否定:
基本上它说来自peopleList2的所有内容,其中peopleList1中的所有ID都与peoplesList2中的id不同 .
从接受的答案中略微不同的方法:)
由于迄今为止所有解决方案都使用了流畅的语法,因此这里是查询表达式语法的解决方案,对于那些感兴趣的人:
我认为它与某些人感兴趣的答案有所不同,甚至认为它很可能对列表来说不是最理想的 . 现在对于具有索引ID的表,这肯定是要走的路 .
派对迟到了,但Linq与SQL兼容的一个很好的解决方案是:
感谢http://www.dotnet-tricks.com/Tutorial/linq/UXPF181012-SQL-Joins-with-C
克劳斯的答案很棒,但ReSharper会要求你“简化LINQ表达”:
var result = peopleList2.Where(p => peopleList1.All(p2 => p2.ID != p.ID));
此Enumerable Extension允许您定义要排除的项列表以及用于查找用于执行比较的键的函数 .
你可以这样使用它
这是一个工作示例,可以获得求职者尚未拥有的IT技能 .
首先,从条件集合中提取id
第二,使用“比较”的东西选择不同于选择的ID
显然你可以使用x.key!=“TEST”,但这只是一个例子