LINQ 익히기: 효율적인 데이터 집계를 위한 GroupBy, 합계 및 개수
이 문서에서는 LINQ의 GroupBy
, Sum
및 Count
메서드를 사용하여 컬렉션 내 항목을 효율적으로 그룹화, 합산 및 계산하는 C# 프로그래밍의 일반적인 과제를 다룹니다. 실제 사례를 살펴보고 일반적인 함정을 강조하며 강력한 솔루션을 제시하겠습니다.
시나리오: 제품 집계
각각 Product
, ProductCode
및 Price
이 포함된 Name
개체 컬렉션을 상상해 보세요. 목표는 이러한 제품을 ProductCode
별로 그룹화하고, 각 코드의 총 가격을 계산하고, 각 그룹의 제품 수를 계산하는 것입니다. 원하는 출력은 각 항목이 제품 코드, 총 가격 및 제품 개수를 나타내는 새 컬렉션입니다.
초기(결함이 있는) 접근 방식
초기 시도는 다음과 같습니다.
<code class="language-csharp">List<Product> products = LoadProducts(); List<ResultLine> result = products .GroupBy(p => p.ProductCode) .SelectMany(group => group.Select( p => new ResultLine { ProductName = p.Name, Quantity = group.Count().ToString(), Price = group.Sum(p => p.Price).ToString(), })) .ToList();</code>
이 코드의 문제점은 SelectMany
을 사용하는 것입니다. 이로 인해 그룹화된 결과가 평면화되어 잘못된 Quantity
(항상 1)이 발생합니다.
올바른 해결책
효율적이고 정확한 솔루션은 SelectMany
을 피하고 각 그룹에서 집계된 데이터를 직접 선택합니다.
<code class="language-csharp">List<ResultLine> result = products .GroupBy(p => p.ProductCode) .Select(group => new ResultLine { ProductName = group.First().Name, // Assumes all products with the same code have the same name Quantity = group.Count(), Price = group.Sum(p => p.Price), }) .ToList();</code>
이 수정된 코드는 제품을 올바르게 그룹화합니다. group.First().Name
은 각 그룹의 첫 번째 제품에서 이름을 검색합니다(동일한 제품 코드에 대해 일관된 이름을 가정). group.Count()
은 각 그룹별로 정확한 개수를 제공하고, group.Sum(p => p.Price)
은 총 가격을 계산합니다. 이제 Quantity
및 Price
이 적절한 숫자 유형(각각 정수 및 소수)이 되어 데이터 무결성이 향상됩니다.
SelectMany
을 제거하고 그룹 속성에 직접 액세스함으로써 효율적이고 정확한 데이터 집계를 달성하고 의도하지 않은 데이터 평면화라는 일반적인 함정을 방지합니다. 이 접근 방식을 사용하면 결과 컬렉션이 원래 제품 컬렉션의 그룹화, 합산 및 계산된 데이터를 정확하게 반영할 수 있습니다.
위 내용은 LINQ의 GroupBy, Sum 및 Count를 사용하여 일반적인 함정을 피하기 위해 컬렉션의 항목을 효율적으로 그룹, 합계 및 계산하려면 어떻게해야합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!