首页 > C# > C#使用 LINQ 获取一个 List<> 中不在另一个列表中的项<>

C#使用 LINQ 获取一个 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 查询,以便为我提供不在 中的所有人。peopleList2peopleList1

这个例子应该给我两个人(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#】栏目查找您需要的精美模板。

相关搜索
  • 下载密码 lanrenmb
  • 下载次数 260次
  • 使用软件 Sublime/Dreamweaver/HBuilder
  • 文件格式 编程语言
  • 文件大小 暂无信息
  • 上传时间 04-17
  • 作者 网友投稿
  • 肖像权 人物画像及字体仅供参考
栏目分类 更多 >
热门推荐 更多 >
微信模板 响应式 微信图片 自适应 微信公众平台 微信素材 微信文章 html5 企业网站 单页式简历模板
您可能会喜欢的其他模板