2013-03-03 30 views
1

我有多個列表可能有多個值,也可能沒有相同數量的項目.. 我只需要按索引將不同名稱的數字相加..c#linq,通過索引總結不同的值

繼承人一些代碼,以幫助解釋...

public static List<p> pList= new List<p>(); 
    public class p 
    { 
     public string name; 
     public double sum; 
     public List<double> ip; 
    } 

所以,我有類「p」,作爲一個列表.. 一些類別「p」的名稱將是相同的,有些不同..

我需要通過索引將「ip」中的值總和「P」 具有相同的名稱..

數據舉例..

name = a, sum = 10, ip = {2,2,2,2,2}  
name = a, sum = 10, ip = {0,0,5,5}  
name = a, sum = 5, ip = {0,0,5}  
name = b, sum = 20, ip = {0,20}  
name = b, sum = 10, ip = {10}  

結果..

name = a, sum = 25, ip = {2,2,12,7,2}  
name = b, sum = 30, ip = {10,20}  

下面是我已經寫了代碼..

List<p> distinctmerge = pList 
         .GroupBy(t => t.name) 
         .Select(g => new p 
         { 
          name = g.Select(a => a.name).FirstOrDefault(), 
          sum = g.Sum(a => a.sum), 
          ip = new List<double>() { 1, 2, 3 } 
         }).ToList(); 

我無法弄清楚的部分在這裏..

ip = new List<double>() { 1, 2, 3 } 

回答

3

您可以通過

ip = Enumerable.Range(0, g.Select(a => a.ip.Length).Max()).Select(idx => g.Select(a => a.ip.ElementAtOrDefault(idx)).Sum()).ToList() 
+1

好。在最後一部分中,您可以從'.ElementAtOrDefault(idx)'中受益。 – 2013-03-03 18:39:00

+0

謝謝,要去試試看..我一直在網上看,看到了一些這樣的東西,但只是想不出來.. – 2013-03-03 18:39:53

+0

真棒..我花了幾個小時試圖找出這個..我應該早點來到這裏。 (0,g.Select(a => a.ip.Count).Max())。Select(idx => g.Select(a) => a.ip.Count> idx?a.ip [idx]:0).Sum())。ToList() 不得不使用Count來代替它,因爲它的List是一個List,並將[idx]更改爲a.ip [idx] – 2013-03-03 18:47:58

2

這是可以做到使用SelectManyGroupBy總結IP列表:

 List<p> distinctmerge = pList 
      .GroupBy(t => t.name) 
      .Select(g => new p 
      { 
       name = g.Select(a => a.name).FirstOrDefault(), 
       sum = g.Sum(a => a.sum), 
       ip = g.SelectMany(a => a.ip.Select((e, i) => new { e, i })) 
         .GroupBy(a => a.i) 
         .OrderBy(a => a.Key) 
         .Select(a => a.Sum(e => e.e)) 
         .ToList() 
      }).ToList();