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);
}
코드 설명
- 데이터 조회 및 테이블 생성
- ret.Tables[0].Rows.Count를 사용하여 총 행 수를 가져옵니다.
- DataTable 객체를 생성하여 데이터를 저장할 준비를 합니다.
- 컬럼 추가
- for 루프를 사용하여 7개의 그룹에 대해 각각의 컬럼을 추가합니다.
- 민감한 컬럼명은 ID_NUMBER, NAME, DOC_NUMBER, ENG_NAME와 같이 일반적인 이름으로 변경하였습니다.
- 데이터 그룹화
- LINQ를 사용하여 데이터를 7개씩 그룹화합니다.
- Select와 GroupBy를 사용하여 인덱스에 따라 데이터를 그룹화하고, 각 그룹을 리스트로 변환합니다.
- 새로운 행 생성 및 추가
- 각 그룹에 대해 새로운 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를 포함하며, 전체 구조는 매우 유연합니다.