2017-04-27 87 views
5

如果您有一个列表并希望合并具有相同Id字段的任何SomeObject的子列表,您将如何执行此操作?下面是该示例对象:C#合并来自父级别对象列表的子对象列表

public class SomeObject 
{ 
    public string Name { get; set; } 
    public int Id { get; set; } 
    public List<KeyPair> ValuePairs {get;set;} 
} 

public class KeyPair 
{ 
    public string Key { get; set; } 
    public string Value { get; set; } 
} 

这是样品创建一个模拟列表:

List<SomeObject> objects = new List<SomeObject>(); 
     objects = new List<SomeObject>() 
     { 
      new SomeObject 
      { 
       Name="Rando Object 1", 
       Id=5, 
       ValuePairs=new List<KeyPair>() 
       { 
        new KeyPair 
        { 
         Key="TestKey1", 
         Value="TestValue1" 
        }, 
        new KeyPair 
        { 
         Key="TestKey2", 
         Value="TestValue2" 
        } 
       } 
      }, 
      new SomeObject 
      { 
       Name="Rando Object 2", 
       Id=5, 
       ValuePairs=new List<KeyPair>() 
       { 
        new KeyPair 
        { 
         Key="TestKey3", 
         Value="TestValue3" 
        }, 
        new KeyPair 
        { 
         Key="TestKey4", 
         Value="TestValue4" 
        } 
       } 
      } 
     }; 

你需要什么的LINQ的排序或相关的查询做创建SomeObject的新列表基于任何具有匹配Id字段的顶级SomeObject进行合并;然后将其KeyPair列表组合到一个列表中。因此,您将拥有SomeObject Id = 5,然后从列表中的两个不同的以前的SomeObject中合并4个密钥对值。名称值可以从新对象中排除。

任何想法?非常感谢。

回答

4

您需要按Id对它们进行分组,并使用SelectMany来选择KeyPair列表。

var result = objects.GroupBy(o => o.Id).Select(group => new SomeObject 
{ 
    Id = group.Key, 
    ValuePairs = group.SelectMany(x => x.ValuePairs).ToList() 
}).ToList(); 
+0

非常感谢您的帮助。 –

2

你可以试试这个:

var res = objects.GroupBy(o => o.Id) 
       .Select(group => new { 
        Id = group.Key, 
        ValuePairs = group.SelectMany(g => g.ValuePairs) 
        }); 

原帖:

var res = objects.Where(o => o.Id == 5).SelectMany(o => o.ValuePairs); 
+0

这将返回'KeyPair'列表,但他需要''SomeObject'具有'Id'列表和'KeyPair'分组列表' –

+0

正确,我将编辑答案并且还要遵守OP要求以省略'从新对象命名。 –

0

使用此功能

https://dotnetfiddle.net/aE6p5H

public List<SomeObject> MergeObj(List<SomeObject> someObjects) 
    { 
     var idList = someObjects.Select(x => x.Id).Distinct().ToList(); 
     var newSomeObjects = new List<SomeObject>(); 
     idList.ForEach(x => 
     { 
      var newValuePairList = new List<KeyPair>(); 
      someObjects.Where(y => y.Id == x).ToList().ForEach(y => 
      { 
       newValuePairList.AddRange(y.ValuePairs); 
      }); 
      newSomeObjects.Add(new SomeObject{Id = x, ValuePairs = newValuePairList}); 
     }); 

     return newSomeObjects; 
    }