2009-06-22 3 views
6

어떤 솔루션이 선호됩니까? 목록 C# Linq 문 또는 총 하위 집합에 대한 foreach()?

:

List<ExampleInfo> exampleList = new List<ExampleInfo>(); 

public class ExampleInfo 
{ 
    internal ExampleInfo() 
    { } 
    /* Business Properties */ 
    public int Id { get; set; } 
    public string Type { get; set; } 
    public decimal Total { get; set; } 
} 

은 내가 '총'값을 기반으로 소계를 얻을 바랍니다.

옵션 1 :

var subtotal1 = exampleList.Where(x => x.Type == "Subtype1").Sum(x => x.Total); 
var subtotal2 = exampleList.Where(x => x.Type == "Subtype2").Sum(x => x.Total); 

옵션 2 : 목록은 대부분의 경우 < 10 항목 될 것입니다

decimal subtotal1 = 0m; 
decimal subtotal2 = 0m; 
foreach (ExampleInfo example in exampleList) 
{ 
    switch (example.Type) 
    { 
     case "Subtype1": 
      subtotal1 += example.Total; 
      break; 
     case "Subtype2": 
      subtotal2 += example.Total; 
      break; 
     default: 
      break; 

    } 
} 

.

편집 : Chris는 내가 언급하지 않은 매우 좋은 점을 제기했습니다. 이 프로그램은 이미 .NET Framework 3.5 SP1을 사용하고 있으므로 호환성은 중요한 고려 사항이 아닙니다.

답변

4

두 예제 모두 코드가 중복되어 있으며 두 가지 모두 변경 준비가되어 있지 않습니다. Type - 세 개의 값이 있으면 어떻게됩니까? 30 명이 있다면?
당신은 그것에 의해 그룹에 LINQ를 사용하여 총 얻을 수 :

var totals = from p in exampleList 
      group p by p.Type into g 
      select new { Type = g.Key, Total = g.Sum(p => p.Total) }; 

그래서 totals 전혀 루프를 실행하지 않는 속성 TypeTotal

+0

정확히 내가 동시에 바빠서 무엇 입력 : –

+0

하하 내가 방금 입력 한 기능을 동등한 –

2

그런 작은 목록에는 성능 차이가 많지 않을 것이라고 생각합니다.

옵션 1은 목록을 두 번 반복하고 옵션 2는 목록을 한 번만 반복합니다. 작은 목록보다 큰 목록에주의하는 것이 더 중요 할 수 있습니다.

옵션 1은 더 읽기 쉽지만 목록을 두 번 반복한다는 점을 분명히 말합니다.

옵션 2의 확실한 이점은 코드가 .NET Framework 2.0에서 작동한다는 것입니다. LINQ를 사용하면 응용 프로그램에 .NET Framework 3.5가 필요합니다.

5

목록 크기에 관계없이 .NET 3.5를 타겟팅하는 경우 가독성을 위해 LINQ를 사용합니다.

나는 그것이 의미하는 바를 쓰는 위대한 팬이며, LINQ는 그런 경우에 이것을 매우 쉽게 만듭니다.

아마도 유형별로 그룹화 된 단일 LINQ 문으로 계산을 가져올 수도 있습니다. .

var subtotals = from x in exampleList 
       group x by x.Type into g 
       select new { Type = x.Key, SubTotal = g.Sum(x => x.Total) }; 

(코드가 같이 작동하는지 완전히 확실하지, 그것은 101 LINQ Samples 중 하나에서 그냥 빨리 적응의 구문 : 그런 식으로 두 LINQ에 대한 루프하지만 두 번째 예에서와 같이 하나가되지 않습니다 그래도 괜찮을 것입니다.)

1

옵션 1의 경우 내부적으로 foreach 루프는 C# 런타임 env에 의해 두 번 실행됩니다. 따라서 처리 유형이 더 많습니다. 그러나 < 10 개의 항목에 대해서는 거의 차이가 없으며 옵션 1은 더 읽기 쉽습니다. 나는 < 10 항목에 대해 옵션 1을 사용할 것입니다.

class <Anonymous> 
{ 
    public string Type { get; }  
    public decimal SubTotal { get; } 
} 

열거를하고 같은 작은 집합에 대한 잔인한 수도 있지만, 적절한 값에 할당 :

+0

C# 컴파일러와 개체의 컬렉션입니다. 실행 시간에 완료됩니다. –

+0

감사합니다. '컴파일러'를 '런타임 env'로 변경했습니다. –

4

옵션 3

var groupings = exampleList 
    .GroupBy(x => x.Type, x => x.Total) 
    .Select(x => new { Type = x.Key, SubTotal = x.Sum() }); 

당신과 같이 클래스의 목록을해야합니다.

관련 문제