我假设有一个简单的 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)
可以使用以下 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 中的解决方案,因此此处不探讨这些选项。与往常一样,根据项目可能具有的性能要求评估任何方法。
如果您覆盖了人员的平等,那么您还可以使用:
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 都与 peopleList2 中的 id 不同。
与接受的答案🙂略有不同
模板简介:该模板名称为【C#使用 LINQ 获取一个 List<> 中不在另一个列表中的项<>】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【C#】栏目查找您需要的精美模板。