gpt4 book ai didi

c# - 使用 LINQ to Objects 在一个集合中查找与另一个集合不匹配的项目

转载 作者:IT王子 更新时间:2023-10-29 04:26:19 25 4
gpt4 key购买 nike

我想在一个集合中查找与另一个集合不匹配的所有项目。但是,这些集合的类型不同;我想写一个 lambda 表达式来指定相等性。

A LINQPad我正在尝试做的事情的例子:

void Main()
{
var employees = new[]
{
new Employee { Id = 20, Name = "Bob" },
new Employee { Id = 10, Name = "Bill" },
new Employee { Id = 30, Name = "Frank" }
};

var managers = new[]
{
new Manager { EmployeeId = 20 },
new Manager { EmployeeId = 30 }
};

var nonManagers =
from employee in employees
where !(managers.Any(x => x.EmployeeId == employee.Id))
select employee;

nonManagers.Dump();

// Based on cdonner's answer:

var nonManagers2 =
from employee in employees
join manager in managers
on employee.Id equals manager.EmployeeId
into tempManagers
from manager in tempManagers.DefaultIfEmpty()
where manager == null
select employee;

nonManagers2.Dump();

// Based on Richard Hein's answer:

var nonManagers3 =
employees.Except(
from employee in employees
join manager in managers
on employee.Id equals manager.EmployeeId
select employee);

nonManagers3.Dump();
}

public class Employee
{
public int Id { get; set; }
public string Name { get; set; }
}

public class Manager
{
public int EmployeeId { get; set; }
}

以上有效,并将返回员工账单 (#10)。不过,它看起来并不优雅,而且对于较大的集合可能效率低下。在 SQL 中,我可能会执行 LEFT JOIN 并找到第二个 ID 为 NULL 的项目。在 LINQ 中执行此操作的最佳做​​法是什么?

编辑:已更新以防止依赖于 Id 等于索引的解决方案。

编辑:添加了 cdonner 的解决方案 - 有人有更简单的方法吗?

编辑:在 Richard Hein 的回答中添加了一个变体,这是我目前最喜欢的。感谢大家的精彩回答!

最佳答案

这与其他一些示例几乎相同,但代码更少:

employees.Except(employees.Join(managers, e => e.Id, m => m.EmployeeId, (e, m) => e));

然而,它并不比 employees.Where(e => !managers.Any(m => m.EmployeeId == e.Id)) 或您的原始语法简单。

关于c# - 使用 LINQ to Objects 在一个集合中查找与另一个集合不匹配的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1647698/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com