我有一个对象Project
,它有许多字段,其中一个是Name
。我有一个包含其中一些字段的项目电子表格,另一个包含其余字段。但是,这两个电子表格都有Name
字段。
我已阅读并填充了两个List<Project>
,仅填充该特定来源的可用字段。例如。列表1中的项目如下所示:
{Name="MyProj", Type="Form", Priority=NULL}
来自清单2的项目:
{Name="MyProj", Type=NULL, Priority="High"}
现在,我想将这两个列表合并为一个,其中每个Project对象都填充了所有字段,Name字段用于匹配元素。
我怎样才能做到这一点?有没有什么好方法可以简洁地做到这一点?
由于
答案 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
中加入并处理结果,以将一个列表的数据合并到另一个列表中。等
当其中一个列表中的项目丢失时,它会变得更加复杂,如果没有列表完成,则会更加复杂。然后,在开头创建项目名称的完整列表可能很有用。