c# DataTable의 행을 검색하여 계산하기
DataTable에는 대개 많은 행들이 있는데 모든 행들이 늘상 필요한 건 아니다. 필요할 때마다 많은 행들 가운데 일부만 추려서 보든지 계산하든지 한다.
행을 검색하여 출력하기
아래는 DataTable에 시간과 정수를 채운 뒤 시간을 조건으로 하여 만족하는 행들만 보이게 하는 예제다. 이때 이용하는 게 DataTable.DefaultView 프라퍼티인데 이거는 customized view 즉 원래 DataTable의 내용은 바꾸지 않고 만들어진 껍데기에 불과하다. 따라서 이걸 DataTable처럼 다룰 수는 없다.
DataTable.Select를 이용하여 행을 검색할 수도 있는데 이건 DataRow 배열을 반환하여 다루기가 번거롭고 느리다.
‘time 0’처럼 칼럼의 이름에 빈칸이 있다면 [time 0]의 형태로 입력한다.
DataTable DataTable1 = new();
private void Form1_Load(object sender, EventArgs e)
{
DataTable1.Columns.Add("time", typeof(DateTime));
DataTable1.Columns.Add("value", typeof(int));
DateTime dateTime = Convert.ToDateTime("09:00:00");
for (int i = 0; i < 10; i++)
{
DataTable1.Rows.Add(dateTime.AddMinutes(i), i);
}
dataGridView1.DataSource = DataTable1;
}
private void button1_Click(object sender, EventArgs e)
{
DataTable1.DefaultView.RowFilter = "time > '09:01:00' And time < '09:05:00'";
}
행을 검색하여 출력하지는 않고 계산만 하기
아래는 출력되는 내용은 그대로 둔 채 조건에 맞는 행들만 대상으로 하여 연산하는 예제다. compute 메떠드는 DefaultView에는 이용할 수 없다.
private void button2_Click(object sender, EventArgs e)
{
Text = DataTable1.Compute("SUM(value)", "time > '09:01:00' And time < '09:05:00'").ToString(); // 9
}
행을 검색하여 출력한 뒤 계산도 하기
아래는 DefaultView의 결과를 새로운 DataTable로 만든 뒤 compute 메떠드를 실행하는 예제다. compute 메떠드는 DataTable에만 쓸 수 있으므로 DataView.ToTable 메떠드를 이용하여 DefaultView의 결과를 새로운 DataTable로 만들었다.
[^1]은 컬렉션의 끝에서 첫 번째 아이템 즉 마지막 아이템을 뜻한다.
private void button3_Click(object sender, EventArgs e)
{
DataTable dataTable = DataTable1.DefaultView.ToTable();
Text = ((int)dataTable.Rows[0]["value"] - (int)dataTable.Rows[^1]["value"]).ToString(); // -2
}