2016-09-02 32 views
2

我做了一個測試案例:從一個foreach內編輯屬性不會影響集合

我有這樣

Id|IdA|IdW|Quantity 
1 1 3 5 
2 1 4 2 
3 2 5 3 

Id一個表的主鍵,IdA是文章編號,IdW是盒子ID,數量是文章的數量。

現在我要組由IdA相加的數量,所以我做:

var groups = 
     models 
      .GroupBy(x => new { x.IdA }) 
      .Select 
      (
       x => 
        new Model 
        { 
         Id = (x.Select(y => y.Id).Count() > 1) ? 0 : x.Select(y => y.Id).First(), 
         IdA = x.Key.IdA, 
         Qty = x.Sum(y => y.Qty) 
        } 
      ); 

這裏models是上面的表格。它工作正常,我也設法保留主鍵時,沒有分組完成(只有一個IdA

現在我想要做到這一點:我想保留IdW爲那些還沒有分組。理想的結果是:

Id|IdA|IdW|Quantity 
0 1 0 7 
3 2 5 3 

我試圖做的在組織的一個foreach,使用主鍵檢索行,然後設置IdW到組,就像這樣:

foreach(var e in groups) 
{ 
    var nonGroupedRow = models.Where(x => e.Id != 0 && x.Id == e.Id).FirstOrDefault(); 
    var targetModel = groups.FirstOrDefault(x => x.Id == e.Id); 
    if(nonGroupedRow != null && targetModel != null) 
    { 
     targetModel.IdW = nonGroupedRow.IdW; 
    } 
} 

這令人難以置信的是不工作。這兩個小組仍然有IdW = 0。我還做了另外一個測試可以肯定,這樣做的:

void Main() 
{ 
    var a = new List<A> { new A { Id = 1 }, new A { Id = 2 } }; 
    a.FirstOrDefault(x => x.Id == 1).Id = 2; 
    // both have Id = 2 
} 

class A 
{ 
    public long Id {get;set;} 
} 

它只是在我的腦海工作,也給予了上面的例子,但它不是。我錯在哪裏?

+0

應該是幾乎一樣的,你怎麼辦'Id'。這可以縮短爲'x.Count()> 1? 0:x.First().Id'。 – juharr

+0

使用左外連接。請參閱msdn:https://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b – jdweng

回答

0

首先你計數計數項的,所以你並不需要指定它計數ID的這將是檢索的第一個的ID相同

其次同樣的事情,該組中發現的量,從那裏

採取從分組數據中的第一項,然後將ID屬性你基本上有了答案

var groups = 
     models 
     .GroupBy(x => new { x.IdA }) 
     .Select 
     (
      x => 
       new Model 
       { 
        Id = (x.Count() > 1) ? 0 : x.First().Id, 
        IdA = x.Key.IdA, 
        IdW = (x.Count() > 1) ? 0 : x.First().IdW, 
        Qty = x.Sum(y => y.Qty) 
       } 
     ); 
+0

請解釋反對 – Neil

+0

對此沒有真正thoguth!謝謝 – Phate01

相關問題