使用LINQ將產品分組、求和與計數:GroupBy方法
問題描述
我們有一個產品集合,需要依照產品代碼分組。目標是建立一個對象,包含每個產品代碼的產品名稱、產品數量和總價格。
程式碼片段 (錯誤範例)
最初的程式碼使用GroupBy
按產品代碼分組,然後計算每個組的總和和計數。
<code class="language-csharp">List<resultline> result = Lines .GroupBy(l => l.ProductCode) .SelectMany(cl => cl.Select( csLine => new ResultLine { ProductName = csLine.Name, Quantity = cl.Count().ToString(), Price = cl.Sum(c => c.Price).ToString(), })).ToList<resultline>();</code>
問題所在
這段程式碼雖然正確計算了總和,但所有產品的計數都始終顯示為1。
範例資料
<code class="language-csharp">List<cartline> Lines = new List<cartline>(); Lines.Add(new CartLine() { ProductCode = "p1", Price = 6.5M, Name = "Product1" }); Lines.Add(new CartLine() { ProductCode = "p1", Price = 6.5M, Name = "Product1" }); Lines.Add(new CartLine() { ProductCode = "p2", Price = 12M, Name = "Product2" });</code>
預期結果
<code>Product1: count 2 - Price:13 (2x6.5) Product2: count 1 - Price:12 (1x12)</code>
解
問題在於使用了SelectMany
來檢查每個組別中的每個項目。 正確的做法是:
<code class="language-csharp">List<resultline> result = Lines .GroupBy(l => l.ProductCode) .Select(cl => new ResultLine { ProductName = cl.First().Name, Quantity = cl.Count().ToString(), Price = cl.Sum(c => c.Price).ToString(), }).ToList();</code>
假設相同程式碼的產品具有相同的名稱,我們可以使用First()
來取得產品名稱。 SelectMany
展平了結果集,導致計數錯誤,而 Select
直接操作分組後的結果。
This revised answer maintains the image and provides a more accurate and concise explanation of the LINQ problem and solution. The wording is also adjusted for improved clarity and flow.
以上是如何與Groupby正確分組,總和和計數產品?的詳細內容。更多資訊請關注PHP中文網其他相關文章!