合并两个包含不同数据的对象列表

时间:2010-06-14 09:47:17

标签: c# list

我有一个对象Project,它有许多字段,其中一个是Name。我有一个包含其中一些字段的项目电子表格,另一个包含其余字段。但是,这两个电子表格都有Name字段。

我已阅读并填充了两个List<Project>,仅填充该特定来源的可用字段。例如。列表1中的项目如下所示:

{Name="MyProj", Type="Form", Priority=NULL}

来自清单2的项目:

{Name="MyProj", Type=NULL, Priority="High"}

现在,我想将这两个列表合并为一个,其中每个Project对象都填充了所有字段,Name字段用于匹配元素。

我怎样才能做到这一点?有没有什么好方法可以简洁地做到这一点?

由于

1 个答案:

答案 0 :(得分:3)

我可能会使用??运算符来查找值。字典可能很有用。

// put one into a dict for faster access
var dict2 = list2.ToDictionaty(x => x.Name, x);

// merge the lists using ??
var merged = list1.Select(x => 
{
    var p2 = dict2[x.Name];
    return new Project()
    {
      Name = x.Name,
      Type = x.Type ?? p2.Type,
      Priority = x.Priority ?? p2.Priority 
    }
});

或者

var merged = list1
  // join the lists by the name 
  .Join(list2, x => x.Name, x => x.Name, (p1, p2) => new { P1 = p1, P2 = p2 } )
  .Select(x => 
    new Project()
    {
      Name = P1.Name,
      Type = P1.Type ?? P2.Type,
      Priority = P1.Priority ?? P2.Priority 
    });

这有几百个变种。您只能在foreach中加入并处理结果,以将一个列表的数据合并到另一个列表中。等

当其中一个列表中的项目丢失时,它会变得更加复杂,如果没有列表完成,则会更加复杂。然后,在开头创建项目名称的完整列表可能很有用。