Xử lý dữ liệu với DataTable trong C# như tính tổng, min, max, duyệt từng dòng, lọc dữ liệu, loại bỏ dòng trùng lặp …
Khóa học lập trình c# cực hay và hiệu quả:
Lọc dữ liệu của DataTable trong C# (Select)
using System; using System.Data; class Program { static void Main() { // Tạo bảng lưu mức lương và giới tính của nhân viên DataTable table = new DataTable("Employees"); table.Columns.Add(new DataColumn("Salary", typeof(int))); table.Columns.Add(new DataColumn("Sex", typeof(char))); table.Rows.Add(100, 'f'); table.Rows.Add(235, 'f'); table.Rows.Add(250, 'm'); table.Rows.Add(310, 'm'); table.Rows.Add(150, 'm'); // Lấy danh sách nhân viên có giới tính là m (nam) và lương >= 230$ DataRow[] result = table.Select("Salary>= 230 AND Sex = 'm'"); foreach (DataRow row in result) { Console.WriteLine("{0}, {1}", row[0], row[1]); } } }
Duyệt từng dòng và từng cột của DataTable trong C#
using System; using System.Data; class Program { static void Main() { DataTable table = GetTable(); foreach (DataRow row in table.Rows) // Duyệt từng dòng (DataRow) trong DataTable { Console.WriteLine("--- Row ---"); foreach (var item in row.ItemArray) // Duyệt từng cột của dòng hiện tại { Console.Write("Item: "); Console.WriteLine(item); // In ra giá trị của ô với dòng và cột tương ứng } } Console.Read(); // Pause. } //Hàm khởi tạo 1 DataTble static DataTable GetTable() { DataTable table = new DataTable(); // Tạo 1 datatable // Khởi tạo các cột table.Columns.Add("Dosage", typeof(int)); table.Columns.Add("Drug", typeof(string)); table.Columns.Add("Patient", typeof(string)); table.Columns.Add("Date", typeof(DateTime)); // Thêm 5 dòng dữ liệu vào bảng table.Rows.Add(15, "Abilify", "Jacob", DateTime.Now); table.Rows.Add(40, "Accupril", "Emma", DateTime.Now); table.Rows.Add(40, "Accutane", "Michael", DateTime.Now); table.Rows.Add(20, "Aciphex", "Ethan", DateTime.Now); table.Rows.Add(45, "Actos", "Emily", DateTime.Now); return table; } }
Các hàm tính toán cơ bản của DataTable trong C#
Ví dụ này sẽ tính ra mức lương cao nhất, thấp nhất, lương trung bình, tổng lương của toàn bộ nhân viên trong công ty
DataTable dt = new DataTable(); dt.TableName = "Employees"; dt.Columns.Add("Name",typeof(string)); dt.Columns.Add("Salary",typeof(int)); dt.Rows.Add("Arnold", 1500); dt.Rows.Add("Leo", 1700); dt.Rows.Add("Sara", 1000); dt.Rows.Add("John", 1400); dt.Rows.Add("Mary", 1800); dt.Rows.Add("Johny", 2100); dt.Rows.Add("Peter", 1750); //Lương Cao nhất object MaxSalary; MaxSalary= dt.Compute("Max(Salary)", ""); MessageBox.Show("Max Salary is : " + MaxSalary.ToString()) //Lương Thấp nhất object MinSalary; MinSalary= dt.Compute("Min(Salary)", ""); MessageBox.Show("Min Salary is : " + MinSalary.ToString()) //Lương trung bình object AvgSalary; AvgSalary= dt.Compute("Avg(Salary)", ""); MessageBox.Show("Average Salary is : " + AvgSalary.ToString()); //Tổng Lương object SumSalary; SumSalary= dt.Compute("Sum(Salary)", ""); MessageBox.Show("Total Salary is : " + SumSalary.ToString())
Tính tổng theo nhóm dạng Group By như SQL:
Cần chuyển Datatable thành dạng IEnumerable và sử dụng LINQ để truy vấn
using System; using System.Data; using System.Linq; class Program { static void Main(string[] args) { DataTable table = new DataTable(); table.Columns.Add("Id", typeof(int)); table.Columns.Add("Value", typeof(decimal)); table.Rows.Add(123, 4); table.Rows.Add(123, 5); table.Rows.Add(234, 1); table.Rows.Add(345, 2); table.Rows.Add(345, 3); var query = from row in table.AsEnumerable() group row by row.Field<int>("Id") into grp orderby grp.Key select new { Id = grp.Key, Sum = grp.Sum(r =r.Field<decimal>("Value")) }; foreach (var grp in query) { Console.WriteLine("{0}\t{1}", grp.Id, grp.Sum); } } }
Loại bỏ các dòng trùng lặp của DataTable trong C# (giống Distinct trong SQL)
Giả sử bạn có 1 bảng có 2 cột là id và value, bạn muốn lấy ra danh sách (một DataTable mới) sau khi đã loại bỏ các dòng trùng lặp theo cả 2 cột
DataTable uniqueCols = dt.DefaultView.ToTable(true, "id", "value");