2010-07-04 6 views
6

트랜잭션 개체 목록에서 BatchNo로 그룹화하고 금액을 합산하려고합니다. 이 시점에서 C# LINQ to Objects : 그룹화/합계 도움말

public class Extract 
{ 
    // Notable fields in TRANSACTION are: String mBatchNo, String mAmount 
    private List<Transaction> Transactions; 

    public void testTransactions() 
    { 

     // Sum of amounts grouped by batch number 
     var sGroup = from t in Transactions 
        group t by t.mBatchNo into g 
        select new { batchNo = g.Key, 
            totalAmount = g.Max(a => (Int32.Parse(a.mAmount)))}; 
    } 
} 

, 내 결과 집합 내가이 개체에 가져온 파일에 대해 확인하는 것이 무엇인지 알아보기 위해서는 지역 주민의 창을 통해 코드보기로 단계.

파일의 마지막 배치에는 3 개의 레코드가 있으며, 각각 100 개의 금액이 있으며 트랜잭션 목록 개체로 드릴링 할 수 있습니다. 그러나 sGroup 결과를 드릴 다운하면 같은 배치가 총 100 개가됩니다 (300이어야 함). 이 쿼리에서 나는 무엇을 엉망으로 만들었습니까?

8 문자 필드의 왼쪽에 0이 채워져 있기 때문에 이것을 문자열로 저장했습니다. 수출의 이유로 나는 문자열로 저장하기로 결정했습니다. 이 (그리고 아마도) 변경 될 수 있지만 그것은 내 질문에 대답하지 않습니다 :이 쿼리 BatchNo에 의해 집합으로 합계를 만드는 방법?

답변

16

당신은 Max 대신 Sum를 호출 할 필요가 : 당신의 mAmount 필드가 string로 저장되어있는 경우 그 예외가 발생하기 때문에

가 나는 또한 제안
var sGroup = from t in Transactions 
    group t by t.mBatchNo into g 
    select new { 
     batchNo = g.Key, 
     totalAmount = g.Sum(a => (int.Parse(a.mAmount))) // Sum, not Max 
    }; 

, (int.Parse보다 더 강력한 방법을 사용하는 문자열이 유효한 정수가 아닌 경우 (예 : 비어있는 경우) 다음과 같이하십시오 :

int ParseOrZero(string text) 
{ 
    int value; 
    if (int.TryParse(text, out value)) 
     return value; 
    else 
     return 0; 
} 

var sGroup = from t in Transactions 
    group t by t.mBatchNo into g 
    select new { 
     batchNo = g.Key, 
     totalAmount = g.Sum(ParseOrZero) // blanks will be treated as 0 
    }; 
+0

와우 그게 내가 놓친 게 주말 이었어! 예외 입력을 주셔서 감사합니다! – Mohgeroth

2

대신 max를 사용하면 그룹에 합계를 사용해야합니다. 지금은 객체의 최대 값으로 속성 만 설정하면 합계는 속성의 모든 값을 합계합니다.