C# 从列表中删除项目<;a>;和列表<;b>;当a.Foo==b.Bar时

C# 从列表中删除项目<;a>;和列表<;b>;当a.Foo==b.Bar时,c#,linq,lambda,C#,Linq,Lambda,我正在寻找一种优雅的方法来比较两个不同的列表集合,并删除与特定字段值匹配的项。例如: 客户对象 class Customer { string CustomerName; string Email; } class Employee { string EmployeeName; string EmployeeID; } List<Customer> Customers = new List<Customers(GetCustomers(

我正在寻找一种优雅的方法来比较两个不同的列表集合,并删除与特定字段值匹配的项。例如: 客户对象

class Customer
{ 
    string CustomerName;
    string Email;
}

class Employee
{
    string EmployeeName;
    string EmployeeID;
 }

 List<Customer> Customers = new List<Customers(GetCustomers());
 List<Employee> Employees = new List<Employees(GetEmployees());

我想知道的是如何从客户列表中删除相应的员工?可以用一个简单的语句吗?或者我需要构建一些东西来处理这个问题吗

创建一个要删除的所有客户列表和另一个要首先删除的所有员工列表。然后从原始列表中删除所有这些。我对lambda不够坚定,无法从内存中写出这一点,但这应该是可行的。

让我们试试:

List<Customer> c = new List<Customer>();
c.Add(new Customer() {CustomerName = "test", Email = "email" });
c.Add(new Customer() { CustomerName = "test1", Email = "email1" });
c.Add(new Customer() { CustomerName = "test2", Email = "email2" });
c.Add(new Customer() { CustomerName = "test3", Email = "email3" });
List<Employee> e = new List<Employee>();
e.Add(new Employee() { EmployeeName = "test2", EmployeeID = "1" });
e.Add(new Employee() { EmployeeName = "test1", EmployeeID = "2" });
e.Add(new Employee() { EmployeeName = "test5", EmployeeID = "3" });
e.Add(new Employee() { EmployeeName = "test4", EmployeeID = "4" });

//remove from the Customers list the corresponding Employee 
e.RemoveAll(x => c.Any(y => y.CustomerName == x.EmployeeName));

foreach (var employee in e)
{
    //TODO: 
}
List c=新列表();
c、 添加(新客户(){CustomerName=“test”,Email=“Email”});
c、 添加(新客户(){CustomerName=“test1”,Email=“email1”});
c、 添加(新客户(){CustomerName=“test2”,Email=“email2”});
c、 添加(新客户(){CustomerName=“test3”,Email=“email3”});
列表e=新列表();
e、 添加(newemployee(){EmployeeName=“test2”,EmployeeID=“1”});
e、 添加(newemployee(){EmployeeName=“test1”,EmployeeID=“2”});
e、 添加(newemployee(){EmployeeName=“test5”,EmployeeID=“3”});
e、 添加(newemployee(){EmployeeName=“test4”,EmployeeID=“4”});
//从客户列表中删除相应的员工
e、 RemoveAll(x=>c.Any(y=>y.CustomerName==x.EmployeeName));
foreach(e中的var员工)
{
//待办事项:
}

可以这样做:

var toBeDeleted = employees.Select(e => e.EmployeeName)
                           .Where(name => customers.Any(c => c.CustomerName == name))
                           .ToList();
customers.RemoveAll(c => toBeDeleted.Contains(c.CustomerName));
employees.RemoveAll(e => toBeDeleted.Contains(e.EmployeeName));
您可以使用
Intersect
来获取应该删除的元素。我不知道有哪一行命令可以做到这一点

那么:

Employees.Where(e => Customers.Any(c=> c.CustomerName == e.EmployeeName)).ToList()
    .ForEach(e=> { 
         Employees.Remove(e); 
         Customers.RemoveAll(c => c.CustomerName == e.EmployeeName);
     });

我看不出它是用一行代码完成的,但也许使用intersect可以用3行代码完成。我想这就是我要找的。我没有意识到可以在.ForEach中实现多个步骤(这很好,因为我确实需要添加额外的操作)。如果是这样的话,那么我猜即使Employees.Remove(e)在上一步中完成了,我仍然可以为Customers.RemoveAll使用原始的e变量(c=>c.CustomerName==e.EmployeeName)?我将尝试一下,看看它是如何工作的。@divamatrix是的,删除只会将其从集合中取出(即它不会处理对象)
var toBeDeleted = employees.Select(e => e.EmployeeName)
                           .Where(name => customers.Any(c => c.CustomerName == name))
                           .ToList();
customers.RemoveAll(c => toBeDeleted.Contains(c.CustomerName));
employees.RemoveAll(e => toBeDeleted.Contains(e.EmployeeName));
Employees.Where(e => Customers.Any(c=> c.CustomerName == e.EmployeeName)).ToList()
    .ForEach(e=> { 
         Employees.Remove(e); 
         Customers.RemoveAll(c => c.CustomerName == e.EmployeeName);
     });