일단 DataTable 대상을 LINQ로 질의하는 방법은 구글링에 많이 나오니 그걸 여쭤보신 건 아닌것 같고, @Vincent 님의 방식에서 좀 더 보완은 아래의 코드를 확인하면 됩니다.
(record는 비슷하게 구성하기 위한 용도로 사용한 것으로 무시해도 됩니다.)
using System.Linq;
var list = new Data[]
{
new(1, "text"),
new(2, "text1|text2")
};
var result = list.SelectMany(x => x.Text.Split('|').Select(y => new Data(x.Id, y)));
foreach (var item in result)
Console.WriteLine(item);
record Data(int Id, string Text);
| 결과
Data { Id = 1, Text = text }
Data { Id = 2, Text = text1 }
Data { Id = 2, Text = text2 }
DataTable에서 위와같이 사용하려면 Field<T>()을 이용해 각 컬럼 값을 가져오고, Data대신 익명 클래스나 튜플로 반환하면 될 것 같네요.
using System;
using System.Data;
using System.Linq;
var dt = new DataTable();
var idColumn = new DataColumn("id", typeof(int));
var valueColumn = new DataColumn("value", typeof(string));
dt.Columns.Add(idColumn);
dt.Columns.Add(valueColumn);
dt.Rows.Add(1, "text");
dt.Rows.Add(2, "text1|test2");
dt.Rows.Add(3, "text1|test2|text3");
foreach (var row in dt.Rows.Cast<DataRow>().ToArray())
{
var id = row.Field<int>("id");
var value = row.Field<string>("value");
foreach (var v in value.Split('|'))
{
dt.Rows.Add(id, v);
}
row.Delete();
}
foreach (DataRow row in dt.Rows)
{
foreach (DataColumn column in dt.Columns)
{
Console.Write($"{row[column]} ");
}
Console.WriteLine();
}
결과 :
1 text
2 text1
2 test2
3 text1
3 test2
3 text3
Code 2
using System;
using System.Data;
using System.Linq;
var dt = new DataTable();
var idColumn = new DataColumn("id", typeof(int));
var valueColumn = new DataColumn("value", typeof(string));
dt.Columns.Add(idColumn);
dt.Columns.Add(valueColumn);
dt.Rows.Add(1, "text");
dt.Rows.Add(2, "text1|test2");
dt.Rows.Add(3, "text1|test2|text3");
var result = dt.AsEnumerable().SelectMany(r => r.Field<string>("value")
.Split('|')
.Select(x => new
{
id = r.Field<int>("id"),
value = x
})
).ToArray();
foreach (var pair in result)
{
Console.WriteLine($"{pair.id} {pair.value}");
}