【问题标题】:Merge 2 collections and change a property of same objects合并 2 个集合并更改相同对象的属性
【发布时间】:2015-08-23 09:17:50
【问题描述】:

我有 2 个客户集合:

  1. 所有客户列表
  2. 相关客户列表

所有客户列表包含所有客户。 相关客户列表包含“所有客户列表”中的一些客户

我想返回一个名为 mergeCustomers 的第三个集合,我可以在其中执行一个函数/逻辑来创建一个新类“MergeCustomer”,其中每个集合元素的 Id 相等,并且对于我在新的 mergeCustomer 上设置的那些属性 IsSelected =真的。

我的第三个集合当然必须返回所有客户,我只是希望在所有客户与相关客户集合匹配的地方更改 IsSelected 属性。

执行此操作的 linq 函数是什么?

【问题讨论】:

    标签: c# linq c#-5.0 .net-4.6


    【解决方案1】:

    简单的方法:

    var mergedCustomers=customers.Select(c=>new MergedCustomer{
      Id=c.Id,
      IsSelected=relatedCustomers.Select(rc=>rc.Id).Contains(c.Id)
    });
    

    加入方式:

    var mergedCustomers=customers.Join(relatedCustomers,c=>c.Id,rc=>rc.Id,
      (c,g)=> g.Select(rc=>new MergedCustomer { Id=rc.Id,IsSelected=true})
        .DefaultIfEmpty(new MergedCustomer {Id=c.Id, IsSelected=false}));
    

    另一种方式(我认为这应该可行):

    var mergedCustomers=customers.Join(relatedCustomers,c=>c.Id,rc=>rc.Id,
      (c,g)=> new MergedCustomer { Id=rc.Id,IsSelected=g.Any()});
    

    【讨论】:

    • “另一种方式”正在执行方法样式连接,但没有相等的检查是否正确?我总是使用连接查询样式。
    • 它仍然使用方法样式连接,但由于您只关心组是否匹配,我只是使用.Any() 来填充布尔值而不是 DefaultIfEmpty 类型语法。此时,c 将包含客户记录,g 将包含所有(如果有)匹配的相关客户记录(基于 c=>c.Id == rc=>rc.id)。这仅适用于1:* 类型的查询,您只关心* 是否存在并且您没有从* 端提取任何数据,因此它并不常见。
    猜你喜欢
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-22
    • 1970-01-01
    • 2020-11-28
    • 1970-01-01
    相关资源
    最近更新 更多