我做了一個測試案例:從一個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;}
}
它只是在我的腦海工作,也給予了上面的例子,但它不是。我錯在哪裏?
應該是幾乎一樣的,你怎麼辦'Id'。這可以縮短爲'x.Count()> 1? 0:x.First().Id'。 – juharr
使用左外連接。請參閱msdn:https://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b – jdweng