2017-04-27 7 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" 
        } 
       } 
      } 
     }; 
당신이 SomeObject의 새로운 목록을 생성 할 필요가 Linq에 어떤 종류의 또는 관련 쿼리

일치하는 Id 필드를 가진 최상위 레벨 SomeObject를 기반으로 병합됩니다. KeyPair 목록을 하나의 목록에 결합합니다. 따라서 SomeObject Id = 5와 4 개의 키 쌍 값이 목록의 두 개의 다른 이전 SomeObject에서 병합됩니다. 이름 값은 새 오브젝트에서 제외 될 수 있습니다.

아이디어가 있으십니까? 정말 고맙습니다.

답변

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

맞습니다. 나는 대답을 편집 할 것이고, Name '을 선택합니다. –

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; 
    } 
,536,