문제

이러한 솔루션 중 어떤 솔루션이 선호됩니까?

목록 :

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);

Option 2:

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;

    }
}

목록은 대부분의 경우 <10 항목입니다.

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

도움이 되었습니까?

해결책

이 두 가지 예 모두 중복 코드가 있으며, 둘 다 변경할 준비가되지 않았습니다. 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 속성이있는 객체 모음입니다 Type 그리고 Total

다른 팁

목록 크기에 관계없이 .NET 3.5를 타겟팅하는 경우 가독성 만 사용하는 경우 LINQ와 함께 갈 것입니다.

나는 당신이 의미하는 바를 쓰는 것에 대한 훌륭한 팬이며, 그것이 어떻게 행해 졌는지가 아니라 LINQ는 그러한 경우에 매우 쉽게이를 쉽게 만듭니다.

계산을 유형별로 그룹화하는 단일 LINQ 문으로 계산할 수도 있습니다. 이렇게하면 LINQ 용 루프 2 개가 없지만 두 번째 예에서는 하나만 있습니다.

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 샘플. 그래도 구문은 괜찮을 것입니다.)

옵션 3

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

당신은 다음과 같은 클래스 목록이 있습니다.

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

적절한 값으로 열거하고 할당하지만, 작은 세트에 대해 과도 할 수 있습니다.

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

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

옵션 1은 더 읽기 쉽지만 목록을 두 번 반복한다는 의견을 제시해야합니다.

옵션 2의 명백한 장점은 코드가 .NET Framework 2.0에서 작동한다는 것입니다. LINQ를 사용하려면 응용 프로그램이 .NET 프레임 워크 3.5가 필요하다는 것을 의미합니다.

옵션 1의 경우 내부적으로 Foreach 루프는 C# 런타임 env에 의해 두 번 실행됩니다. 따라서 처리 유형이 더 많을 것입니다. 그러나 <10 항목의 경우 아무런 차이가 거의 없으며 옵션 1은 더 읽기 쉬운 것 같습니다. <10 항목에 대한 옵션 1과 함께 갈 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top