2017-04-27 61 views
5

Bir Listeniz varsa ve aynı Id alanına sahip herhangi bir SomeObject öğesinin alt Listesini birleştirmek istediğinizde, bunu nasıl yaparsınız?C# Birleştirme Üst düzeyden alt nesnelerin listesi Nesne Listesi

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

Ve bu sahte listenin örnek yaratılmasıdır: İşte örnek nesnelerdir

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" 
        } 
       } 
      } 
     }; 
Eğer SomeObject yeni bir listesini oluşturmak için yapmanız gerekir Linq ne tür veya ilgili sorgu

Bu, eşleşen Id alanlarına sahip herhangi bir üst düzey SomeObject'e dayalı olarak birleştirilir; daha sonra KeyPair listesini tek bir listeye birleştirir. Bu nedenle, Listede iki farklı önceki SomeObject öğesinden bir araya gelen SomeObject Id = 5 ve sonra da 4 anahtar çifti değerine sahip olursunuz. İsim değeri yeni nesneden silinebilir.

Herhangi bir fikrin var mı? Çok teşekkür ederim.

cevap

4

Onları Id gruplandırmanız ve SelectMany listesinden KeyPair listesini seçmek için kullanmanız gerekir.

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

Bu, yardımlarınız için teşekkürler. –

2

Bu deneyebilirsiniz:

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

Orijinal Mesaj:

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

Bu, 'KeyPair' listesini döndürecektir, ancak "Id" ve "KeyPair" –

+0

Doğru gruplandırılmış listesi ile "SomeObject" listesinin olması gerekir, Ben cevabı düzenleyeceğim ve ayrıca OP gereksinimi ihmal etmek için Yeni nesneden isim. –

0

bu işlevi kullanın

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; 
    } 
İlgili konular