2017-04-27 137 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; 
    }