2016-06-07 89 views
-3

型號:如何合併這兩個列表?

public class DogOwner 
{ 
    public int OwnerId {get;set;} 
    public List<Dog> Dogs {get;set;} 
} 

public class CatOwner 
{ 
    public int OwnerId {get;set;} 
    public List<Cat> Cats {get;set;} 
} 

所以我有列表和列表,並希望將它們合併到業主的名單,其中所有者是:

public class Owner 
{ 
    public int OwnerId {get;set;} 
    public int DogsCount {get;set} 
    public int CatsCount {get;set;} 
} 

例如,如果輸入數據爲:

List<DogOwner>: 
DogOwner Id=1 with 3 dogs 
DogOwner Id=2 with 2 dogs 

List<CatOwner> 
CatOwner Id=5 with 2 cats 
CatOwner Id=2 with 1 cat 

的結果應該是:

List<Owner> 
Owner Id=1 CatsCount = 0, DogsCount=3 
Owner Id=2 CatsCount = 1, DogsCount=2 
Owner Id=5 CatsCount = 2, DogsCount=0 

我怎樣才能做到呢? :)

+0

@AndyKorneyev是的。使用'Select'和'Concat'我可以通過'Owner Id = 2 CatsCount = 1 DogsCount = 0'和'Owner Id = 2 CatsCount = 0 DogsCount = 2'得到一個列表,但這不是我想要的。你能幫我麼? –

+1

一旦你選擇了'Select'和'Concat',繼續'GroupBy'。 –

+0

@Elekk你知道多態是什麼嗎?你是編程初學者,還是隻是不瞭解linq? – Mafii

回答

2

使用Linq你可以這樣做。

第一個Concat這兩個清單然後GroupByOwnerId得到貓/狗的數量。

var results = dogowners.Select(x=> new Owner()        
          { 
           OwnerId = x.OwnerId, 
           DogsCount = x.Dogs.Count() 
          }) 
         .Concat(catowners.Select(x=> new Owner() 
          { 
           OwnerId = x.OwnerId, 
           CatsCount = x.Cats.Count() 
          })) 
         .GroupBy(x=> x.OwnerId) 
         .Select(x=> new Owner() 
         { 
          OwnerId = x.Key, 
          DogsCount = x.Sum(s=>s.DogsCount), 
          CatsCount = x.Sum(s=>s.CatsCount) 
         }) 
         .ToList();  

既然你是新的,我雖然不Linq解決方案可能會幫助你。

非LINQ的

Dictionary<int, Owner> owners = new Dictionary<int, Owner>(); 
    foreach(var dg in dogowners) 
    { 

     if(owners.ContainsKey(dg.OwnerId)) 
     { 
      owners[dg.OwnerId].DogsCount += dg.Dogs.Count(); 
     } 
     else 
     { 
      owners.Add(dg.OwnerId, new Owner() 
      { 
       OwnerId = dg.OwnerId, 
       DogsCount = dg.Dogs.Count() 
      }); 
     }   
    } 

    foreach(var ct in catowners) 
    { 
     if(owners.ContainsKey(ct.OwnerId)) 
     { 
      owners[ct.OwnerId].CatsCount += ct.Cats.Count(); 
     } 
     else 
     { 
      owners.Add(ct.OwnerId, new Owner() 
      { 
       OwnerId = ct.OwnerId, 
       CatsCount = ct.Cats.Count() 
      }); 
     }   
    } 

入住這Demo

+0

我不敢相信我們寫了完全相同的解決方案!太瘋狂了。豎起大拇指給你。 – user3185569

+0

會發生一些時間:-) –

2

這是不漂亮,但它的工作原理:

(關鍵是既DogOwner和CatOwner轉化爲所有者)

var results = dogOwners.Select(x => new Owner() { OwnerId = x.OwnerId, DogsCount = x.Dogs.Count }) 
         .Union(catOwners.Select(x => new Owner() { OwnerId = x.OwnerId, CatsCount = x.Cats.Count })) 
         .GroupBy(x => x.OwnerId) 
         .Select(x => 
           new Owner() 
           { 
            OwnerId = x.Key, 
            CatsCount = x.Sum(y => y.CatsCount), 
            DogsCount = x.Sum(y => y.DogsCount) 
           });