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
은 그룹화된 결과에 직접 작동합니다.
이 수정된 답변은 이미지를 유지하고 LINQ 문제와 해결 방법에 대한 보다 정확하고 간결한 설명을 제공하며 명확성과 흐름을 높이기 위해 문구도 조정되었습니다.
위 내용은 LINQ의 제품을 올바르게 그룹, 합계 및 계산하는 방법은 GroupBy와 함께하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!