[개발] C#, .Net

[C#] LINQ를 이용한 데이터 GroupBy 그룹화 예시

  • -
반응형

 

 

7개씩 그룹화된 DataRow 리스트를 사용하는 방법

이 글에서는 LINQ를 사용하여 DataRow를 7개씩 그룹화하는 방법을 단계별로 설명합니다. DataTable의 데이터를 효과적으로 처리하는 방법을 알아보세요.

 

 

 

 

 

 

 

예시 데이터

아래는 DataTable에 15개의 행이 있는 예시 데이터입니다:

Index ID_NUMBER NAME DOCUMENT_NUMBER ENGLISH_NAME
0 001 Alice D001 EN001
1 002 Bob D002 EN002
2 003 Charlie D003 EN003
3 004 David D004 EN004
4 005 Eve D005 EN005
5 006 Frank D006 EN006
6 007 Grace D007 EN007
7 008 Heidi D008 EN008
8 009 Ivan D009 EN009
9 010 Judy D010 EN010
10 011 Kim D011 EN011
11 012 Leo D012 EN012
12 013 Mallory D013 EN013
13 014 Neil D014 EN014
14 015 Olivia D015 EN015

 

 

 

 

 

 

 

그룹화된 데이터

이 코드는 DataTable의 행을 7개씩 그룹화하여 아래와 같은 3개의 그룹을 생성합니다:

 

 

 

 

 

 

첫 번째 그룹 (Index 0 ~ 6)

ID_NUMBER NAME DOCUMENT_NUMBER ENGLISH_NAME
001 Alice D001 EN001
002 Bob D002 EN002
003 Charlie D003 EN003
004 David D004 EN004
005 Eve D005 EN005
006 Frank D006 EN006
007 Grace D007 EN007

 

 

 

 

 

 

두 번째 그룹 (Index 7 ~ 13)

ID_NUMBER NAME DOCUMENT_NUMBER ENGLISH_NAME
008 Heidi D008 EN008
009 Ivan D009 EN009
010 Judy D010 EN010
011 Kim D011 EN011
012 Leo D012 EN012
013 Mallory D013 EN013
014 Neil D014 EN014

 

 

 

 

 

 

 

세 번째 그룹 (Index 14)

ID_NUMBER NAME DOCUMENT_NUMBER ENGLISH_NAME
015 Olivia D015 EN015

 

 

 

 

 

 

 

그룹화된 데이터 구조

최종 그룹화된 데이터 구조는 다음과 같습니다:

groupedRows
|
|-- Group 1 (7 DataRow items)
|   |-- DataRow 1: { ID_NUMBER = "001", NAME = "Alice", DOCUMENT_NUMBER = "D001", ENGLISH_NAME = "EN001" }
|   |-- DataRow 2: { ID_NUMBER = "002", NAME = "Bob", DOCUMENT_NUMBER = "D002", ENGLISH_NAME = "EN002" }
|   |-- DataRow 3: { ID_NUMBER = "003", NAME = "Charlie", DOCUMENT_NUMBER = "D003", ENGLISH_NAME = "EN003" }
|   |-- DataRow 4: { ID_NUMBER = "004", NAME = "David", DOCUMENT_NUMBER = "D004", ENGLISH_NAME = "EN004" }
|   |-- DataRow 5: { ID_NUMBER = "005", NAME = "Eve", DOCUMENT_NUMBER = "D005", ENGLISH_NAME = "EN005" }
|   |-- DataRow 6: { ID_NUMBER = "006", NAME = "Frank", DOCUMENT_NUMBER = "D006", ENGLISH_NAME = "EN006" }
|   |-- DataRow 7: { ID_NUMBER = "007", NAME = "Grace", DOCUMENT_NUMBER = "D007", ENGLISH_NAME = "EN007" }
|
|-- Group 2 (7 DataRow items)
|   |-- DataRow 1: { ID_NUMBER = "008", NAME = "Heidi", DOCUMENT_NUMBER = "D008", ENGLISH_NAME = "EN008" }
|   |-- DataRow 2: { ID_NUMBER = "009", NAME = "Ivan", DOCUMENT_NUMBER = "D009", ENGLISH_NAME = "EN009" }
|   |-- DataRow 3: { ID_NUMBER = "010", NAME = "Judy", DOCUMENT_NUMBER = "D010", ENGLISH_NAME = "EN010" }
|   |-- DataRow 4: { ID_NUMBER = "011", NAME = "Kim", DOCUMENT_NUMBER = "D011", ENGLISH_NAME = "EN011" }
|   |-- DataRow 5: { ID_NUMBER = "012", NAME = "Leo", DOCUMENT_NUMBER = "D012", ENGLISH_NAME = "EN012" }
|   |-- DataRow 6: { ID_NUMBER = "013", NAME = "Mallory", DOCUMENT_NUMBER = "D013", ENGLISH_NAME = "EN013" }
|   |-- DataRow 7: { ID_NUMBER = "014", NAME = "Neil", DOCUMENT_NUMBER = "D014", ENGLISH_NAME = "EN014" }
|
|-- Group 3 (1 DataRow item)
    |-- DataRow 1: { ID_NUMBER = "015", NAME = "Olivia", DOCUMENT_NUMBER = "D015", ENGLISH_NAME = "EN015" }
    

이 구조는 LINQ 작업 후 groupedRows에 행들이 그룹화되고 저장되는 방식을 보여줍니다. 각 그룹은 최대 7개의 DataRow를 포함하며, 전체 구조는 매우 유연합니다.

 

 

 

int totalRow = ret.Tables[0].Rows.Count; // 조회 데이터 건수
DataTable dataTable = new DataTable();

// 각 세트의 컬럼을 한 번만 추가
for (int i = 0; i < 7; i++)
{
    dataTable.Columns.Add("ID_NUMBER" + i, typeof(string));
    dataTable.Columns.Add("NAME" + i, typeof(string));
    dataTable.Columns.Add("DOC_NUMBER" + i, typeof(string));
    dataTable.Columns.Add("ENG_NAME" + i, typeof(string));
}

// LINQ를 사용하여 데이터를 그룹화
var groupedRows = ret.Tables[0].AsEnumerable()
    .Select((row, index) => new { row, index })
    .GroupBy(x => x.index / 7)
    .Select(g => g.Select(x => x.row).ToList())
    .ToList();

foreach (var group in groupedRows)
{
    DataRow newRow = dataTable.NewRow();
    for (int i = 0; i < group.Count; i++)
    {
        newRow["ID_NUMBER" + i] = group[i]["ID_NUMBER"];
        newRow["NAME" + i] = group[i]["NAME"];
        newRow["DOC_NUMBER" + i] = group[i]["DOC_NUMBER"];
        newRow["ENG_NAME" + i] = group[i]["ENG_NAME"];
    }
    dataTable.Rows.Add(newRow);
}

코드 설명

  1. 데이터 조회 및 테이블 생성
    • ret.Tables[0].Rows.Count를 사용하여 총 행 수를 가져옵니다.
    • DataTable 객체를 생성하여 데이터를 저장할 준비를 합니다.
  2. 컬럼 추가
    • for 루프를 사용하여 7개의 그룹에 대해 각각의 컬럼을 추가합니다.
    • 민감한 컬럼명은 ID_NUMBER, NAME, DOC_NUMBER, ENG_NAME와 같이 일반적인 이름으로 변경하였습니다.
  3. 데이터 그룹화
    • LINQ를 사용하여 데이터를 7개씩 그룹화합니다.
    • Select와 GroupBy를 사용하여 인덱스에 따라 데이터를 그룹화하고, 각 그룹을 리스트로 변환합니다.
  4. 새로운 행 생성 및 추가
    • 각 그룹에 대해 새로운 DataRow를 생성하고 데이터를 채웁니다.
    • 7개의 데이터가 채워질 때마다 또는 마지막 데이터일 때 새로운 행을 dataTable에 추가합니다.

 

 

 

 

 

 

 

 

 

 

 

예시 데이터

아래는 DataTable에 15개의 행이 있는 예시 데이터입니다:

IndexID_NUMBERNAMEDOC_NUMBERENG_NAME

0 001 Alice D001 EN001
1 002 Bob D002 EN002
2 003 Charlie D003 EN003
3 004 David D004 EN004
4 005 Eve D005 EN005
5 006 Frank D006 EN006
6 007 Grace D007 EN007
7 008 Heidi D008 EN008
8 009 Ivan D009 EN009
9 010 Judy D010 EN010
10 011 Kim D011 EN011
11 012 Leo D012 EN012
12 013 Mallory D013 EN013
13 014 Neil D014 EN014
14 015 Olivia D015 EN015

 

 

 

 

 

 

 

 

 

 

 

 

 

그룹화된 데이터 구조

최종 그룹화된 데이터 구조는 다음과 같습니다:

groupedRows
|
|-- 그룹 1 (7 DataRow 항목)
|   |-- DataRow 1: { ID_NUMBER = "001", NAME = "Alice", DOC_NUMBER = "D001", ENG_NAME = "EN001" }
|   |-- DataRow 2: { ID_NUMBER = "002", NAME = "Bob", DOC_NUMBER = "D002", ENG_NAME = "EN002" }
|   |-- DataRow 3: { ID_NUMBER = "003", NAME = "Charlie", DOC_NUMBER = "D003", ENG_NAME = "EN003" }
|   |-- DataRow 4: { ID_NUMBER = "004", NAME = "David", DOC_NUMBER = "D004", ENG_NAME = "EN004" }
|   |-- DataRow 5: { ID_NUMBER = "005", NAME = "Eve", DOC_NUMBER = "D005", ENG_NAME = "EN005" }
|   |-- DataRow 6: { ID_NUMBER = "006", NAME = "Frank", DOC_NUMBER = "D006", ENG_NAME = "EN006" }
|   |-- DataRow 7: { ID_NUMBER = "007", NAME = "Grace", DOC_NUMBER = "D007", ENG_NAME = "EN007" }
|
|-- 그룹 2 (7 DataRow 항목)
|   |-- DataRow 1: { ID_NUMBER = "008", NAME = "Heidi", DOC_NUMBER = "D008", ENG_NAME = "EN008" }
|   |-- DataRow 2: { ID_NUMBER = "009", NAME = "Ivan", DOC_NUMBER = "D009", ENG_NAME = "EN009" }
|   |-- DataRow 3: { ID_NUMBER = "010", NAME = "Judy", DOC_NUMBER = "D010", ENG_NAME = "EN010" }
|   |-- DataRow 4: { ID_NUMBER = "011", NAME = "Kim", DOC_NUMBER = "D011", ENG_NAME = "EN011" }
|   |-- DataRow 5: { ID_NUMBER = "012", NAME = "Leo", DOC_NUMBER = "D012", ENG_NAME = "EN012" }
|   |-- DataRow 6: { ID_NUMBER = "013", NAME = "Mallory", DOC_NUMBER = "D013", ENG_NAME = "EN013" }
|   |-- DataRow 7: { ID_NUMBER = "014", NAME = "Neil", DOC_NUMBER = "D014", ENG_NAME = "EN014" }
|
|-- 그룹 3 (1 DataRow 항목)
    |-- DataRow 1: { ID_NUMBER = "015", NAME = "Olivia", DOC_NUMBER = "D015", ENG_NAME = "EN015" }

이 구조는 LINQ 작업 후 groupedRows에 행들이 그룹화되고 저장되는 방식을 보여줍니다. 각 그룹은 최대 7개의 DataRow를 포함하며, 전체 구조는 매우 유연합니다.

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.