LINQ 특정 패턴의 컬럼명 데이터들의 합계 구하기 질문

안녕하세요. LINQ 관련 질문 드리려 이렇게 글을 씁니다.
분명 되게 기초적인 질문 일탠데… 수양이 부족해서 헤매고 있네요.
조금만 도와주시면 감사하겠습니다.

[상황 설명]
DataTable dt가 있습니다.
dt는 A_Money B_Money C_Money A_Name B_Name C_Name 란 6개의 컬럼을 가지고 있습니다.
간단히 테이블로 표현하자면 아래와 같은 구조일 것 입니다.

A_Money B_Money C_Money A_Name B_Name C_Name 
123          123          321          "Kim1"     "Bob1"    "Jan1"
123          123          321          "Kim2"     "Bob2"    "Jan2"
123          123          321          "Kim3"     "Bob3"    "Jan3"
123          123          321          "Kim4"     "Bob4"    "Jan4"
 ...             ...            ...             ...             ...             ...

목표는 Money로 끝나는 컬럼들의 합계를 구하는 것입니다. 이를 코드로 표현하면 아래와 같습니다.

var moneySum = dt.AsEnumerable()
    .Sum(d => 
		d.Field<double>("A_Money")
		+ d.Field<double>("B_Money")
		+ d.Field<double>("C_Money")
    );

이런 결과를 기대합니다.

567
567
567

[질문]
저 moneySum 코드의 문제는 A_Money, B_Money, C_Money … @_Money 컬럼이 늘어날 때 마다 직접 코드를 추가해야 한다는 점입니다. 이에 컬럼명이 Money로 끝나는 데이터만 Select해서 Sum 하려 하는데 여기서 헤매고 있습니다.

string columnName = "Money";
var moneySum = dt.AsEnumerable()
    .Where(x=> dt.Columns.Contains(columnName))
    .Sum(d => 
		d.Field<double>("A_Money")
		+ d.Field<double>("B_Money")
		+ d.Field<double>("C_Money")
    );

이렇게 Where절에 Contains 함수로 호출하면 dt에 "Money"란 컬럼이 있는가 여부로 dt 전체를 반환하기에 아무런 의미가 없었습니다.

짱구를 굴려 여기저기 검색을 해봐도 답을 찾기 어렵네요… :sob: :sob:

2 Likes

퇴근시간 전에 간단히 답변하는거라., 정확히 이해를 못하고 답변 다는 걸수도 있는데.,

단순히 DataTable의 컬럼을 loop 돌려서 ~~Money컬럼만 찾아 데이터의 합계를 구하면 되는 것 아닌가요?

foreach (DataColumn column in dt.Columns)
{
        if (column.ColumnName.EndsWith("_Money") && column.DataType == typeof(int))
        {
                // 여기에 _Money로 끝나는 컬럼의 데이터만 수집 후 별도로 Key / Value 쌍으로 보관해 놓고
        }
}


// 여기서 Sum 구현
4 Likes
var dict = new Dictionary<string, decimal>();

foreach (DataColumn column in dt.Columns)
{
    if (column.ColumnName.EndsWith("Money"))
    {
        dict.Add(column.ColumnName, dt.AsEnumerable().Sum(dra => Convert.ToDecimal(dra.Field<double>(column.ColumnName))));
    }
}
var sum = dict.Sum(d => d.Value);

감사합니다. 덕분에 쉽게 처리했습니다. :+1: :+1: :+1:

5 Likes