2015-05-08 24 views
1

我有两个动态列表,每个列表项包括三个属性:'Id'(int),'LikesRed'(bool)和'LikesBlue'(布尔)。合并两个动态列表并覆盖值

我想合并这两个列表,按照它的'Id'对每个项目进行分组,但我也想用任何'true'值覆盖任何'false'值。

因此,举例来说,这里是数据为我的两个列表:

List1 

{ Id = 1, LikesRed = True, LikesBlue = False } 
{ Id = 2, LikesRed = True, LikesBlue = False } 
{ Id = 4, LikesRed = False, LikesBlue = True } 

List2 

{ Id = 1, LikesRed = False, LikesBlue = True } 
{ Id = 3, LikesRed = False, LikesBlue = True } 
{ Id = 4, LikesRed = True, LikesBlue = False } 

这里是我想要的结果:

{ Id = 1, LikesRed = True, LikesBlue = True } 
{ Id = 2, LikesRed = True, LikesBlue = False } 
{ Id = 3, LikesRed = False, LikesBlue = True } 
{ Id = 4, LikesRed = True, LikesBlue = True } 

我已经成功地合并两个列表(但项目没有分组)使用以下内容:

var results = list1.Concat(list2); 

我也试图将这个列表中的项目用LI NQ(它的工作原理,但我不知道我能/应该用它做):

var final = from x in results 
      group x by x.Id into g 
      select g; 

谁能提供任何意见,我怎么能实现我的目标是什么?

+0

https://msdn.microsoft.com/en-us/library/bb545971.aspx – Banana

回答

5

只是检查是否在组中的任何项目已值设置为true:

from x in list1.Concat(list2) 
group x by x.Id into g 
select new { 
    Id = g.Key, 
    LikesRed = g.Any(x => x.LikesRed), 
    LikesBlue = g.Any(x => x.LikesBlue) 
} 
+1

完美,简单的解决方案! – mmmoustache

-1

您可以第一组列出了IDS有像你已经做了和丹恩使用Zip与您的喜好覆盖值。