- [C#] Hướng dẫn sử dụng temp mail service api trên winform
- [C#] Hướng dẫn tạo mã thanh toán VietQR Pay không sử dụng API trên winform
- [C#] Hướng Dẫn Tạo Windows Service Đơn Giản Bằng Topshelf
- [C#] Chia sẻ source code đọc dữ liệu từ Google Sheet trên winform
- [C#] Chia sẻ source code tạo mã QR MOMO đa năng Winform
- [C#] Chia sẻ source code phần mềm lên lịch tự động chạy ứng dụng Scheduler Task Winform
- [Phần mềm] Tải và cài đặt phần mềm Sublime Text 4180 full version
- [C#] Hướng dẫn download file từ Minio Server Winform
- [C#] Hướng dẫn đăng nhập zalo login sử dụng API v4 trên winform
- [SOFTWARE] Phần mềm gởi tin nhắn Zalo Marketing Pro giá rẻ mềm nhất thị trường
- [C#] Việt hóa Text Button trên MessageBox Dialog Winform
- [DEVEXPRESS] Chia sẻ code các tạo report in nhiều hóa đơn trên XtraReport C#
- [POWER AUTOMATE] Hướng dẫn gởi tin nhắn zalo từ file Excel - No code
- [C#] Chia sẻ code lock và unlock user trong domain Window
- [DEVEXPRESS] Vẽ Biểu Đồ Stock Chứng Khoán - Công Cụ Thiết Yếu Cho Nhà Đầu Tư trên Winform
- [C#] Hướng dẫn bảo mật ứng dụng 2FA (Multi-factor Authentication) trên Winform
- [C#] Hướng dẫn convert HTML code sang PDF File trên NetCore 7 Winform
- [C#] Hướng dẫn viết ứng dụng chat với Gemini AI Google Winform
- Hướng dẫn khóa file bằng nhiều process id, không cho xóa tập tin
- Hướng dẫn cách tạo Product Id cho ứng dụng phần mềm XXXXX-XXXXX-XXXXX-XXXXX
[C#] LINQ trong CSharp - Phần cuối
Tiếp theo của Phần hai, tiếp tục sẽ là các phương thức cơ bản của LINQ trong C#: Element, Aggregation, Quantifiers, Generation.
- Element LINQ (Phần tử):
- First: Trả về element đầu tiên trong sequence. Tương đương SELECT TOP 1...ORDER BY...:
//Trả về chuỗi đầu tiên có ký tự bắt đầu bằng t trong dsChuoi
string query = dsChuoi.First(x => x.StartsWith("t"));
- FirstOrDefault: Trả về element đầu tiên trong sequence hoặc giá trị mặc định nếu sequence không chứa element nào.
//Trả về null nếu không có element nào thỏa điều kiện
string query = dsChuoi.FirstOrDefault(x => x.StartsWith("z"));
//Trả về 0 nếu không có element nào có gái trị bằng 10
int query = dsSo.FirstOrDefault(x => x==10);
- Last: Trả về element cuối cùng trong sequence. Tương đương SELECT TOP 1...ORDER BY... DESC.
- LastOrDefalut: Trả về element cuối cùng trong sequence hoặc giá trị mặc định nếu sequence không chứa element nào.
- Single: Trả về chỉ duy nhất một element trong sequence và sẽ ném ngoại lệ nếu có hơn 1 element.
//lỗi vì có nhiều element thỏa điều kiện
string query = dsChuoi.Single(x => x.StartsWith("t"));
//Lỗi vì dschuoi có nhiều element
string query = dsChuoi.Single();
//OK vì chỉ có 1 element thỏa điều kiện
string query = dsChuoi.Single(x => x.StartsWith("k"));
- SingleOrDefault: Trả về chỉ duy nhất một element trong sequence hoặc giá trị mặc định nếu sequence rỗng. Nó sẽ ném ngoại lệ nếu có hơn một element.
//Trả về null nếu không có element nào thỏa điều kiện
string query = dsChuoi.SingleOrDefault(x => x.StartsWith("z"));
//Trả về 0 nếu không có element nào có gái trị bằng 10
int query = dsSo.SingleOrDefault(x => x==10);
- ElementAt: Trả về element ở chỉ số xác định trong sequence.
//lấy element thứ 2 trong dschuoi
string query = dsChuoi.ElementAt(1);
- ElementAtOrDefault: Trả về element ở chỉ số xác định trong sequence hoặc giá trị mặc định nếu chỉ số nằm ngoài sequence.
//Trả về 0 nếu không vì chỉ số 50 vượt quá số element trong sequence
int query = dsSo.ElementAtOrDefault(50);
- DefaultIfEmpty: Trả về các element của một sequence xác định, hoặc giá trị mặc định trong một collection nếu sequence rỗng.
Pet defaultPet = new Pet { Name = "Default Pet", Age = 0 };
//Tạo một danh sách có phần tử
List pets1 = new List{ new Pet { Name="Barley", Age=8 },
new Pet { Name="Boots", Age=4 }, new Pet { Name="Whiskers", Age=1 } };
var query = pets1.DefaultIfEmpty();
StringBuilder stb = new StringBuilder();
foreach (var s in query)
stb.AppendLine(s.Name);
//Tạo một danh sách rỗng
List pets2 = new List();
//Sequence rỗng thì nó sẽ lấy defaultPet
var query2 = pets2.DefaultIfEmpty(defaultPet);
foreach (var s in query2)
stb.AppendLine(s.Name);
- Aggregation LINQ (Thống kê):
- Aggregate: Tính toán tích lũy trong sequence (thống kê tùy ý).
//Bài toán sum
int kq = dsSo.Aggregate( (Sohientai, Soketiep) => Sohientai+Soketiep );
//Dùng tham số Seed để khởi tạo giá trị tích lũy ban đầu là 2
int kq = dsSo.Aggregate(2, (Sohientai, Soketiep) => (Sohientai + Soketiep) );
//Đảo ngược lại các element trong dsChuoi
string str = dsChuoi.Aggregate((chuoihientai, chuoiketiep) => chuoiketiep+ " " + chuoihientai);
- Average: Tính trung bình của một sequence.
//Tính trung bình các số trong dsSo
double tb = dsSo.Average();
//Tính đơn giá trung bình sản phẩm Apple
SpApple[] dssp = {new SpApple {Ten="iPhone",Dg=17}, new SpApple {Ten="iPad",Dg=10}, new SpApple {Ten="iPod",Dg=2}, new SpApple {Ten="Mac Laptop",Dg=25}
};
double tb = dssp.Average(x => x.Dg);
//Lớp hỗ trợ
class SpApple
{
public string Ten { get; set; }
public int Dg { get; set; }
}
- Count: Trả về số lượng element trong sequence.
List dssp = new List {new Sanpham { Tensp = "Xà lách", Nhomsp="Rau cải" },new Sanpham { Tensp = "Cua biển", Nhomsp="Hải sản" },new Sanpham { Tensp = "Đậu xanh", Nhomsp="Ngũ cốc" } ,new Sanpham { Tensp = "Tôm càng", Nhomsp="Hải sản" } };
//Đếm số lượng sản phẩm theo từng Nhomsp
var query = dssp.GroupBy(x => x.Nhomsp)
.Select(x => new {x.Key, sosp= x.Count() });
//Đếm số lượng sản phẩm của Nhomsp là “Hải sản”
int dem = dssp.Count(x => x.Nhomsp == "Hải sản");
- LongCount: Trả về số lượng element trong sequence, kiểu dữ liệu là Int64.
long dem = dssp.LongCount(x => x.Nhomsp == "Hải sản");
- Sum: Tính tổng của các element kiểu số trong một sequence.
//Tính tổng trị giá các sản phẩm Apple
int tong = dssp.Sum(x => x.Dg);
//Tính tổng trong dsSo
int tong = dsSo.Sum();
- Max: Trả về giá trị lớn nhất trong sequence.
- Min: Trả về giá trị nhỏ nhất trong sequence.
//Tìm số lớn nhất trong dsSo
int max = dsSo.Max();
//Tìm đơn giá nhỏ nhất trong danh sách sản phẩm Apple
int min = dssp.Min(x => x.Dg);
//Tìm giá trị nhỏ nhất trong dsChuoi
string str = dsChuoi.Min();
- Quantifiers LINQ (định lượng, lượng hóa):
- All : Xác định tất cả các element của sequence có thỏa điều kiện hay không. Trả về kiểu bool.
//Tất cả các element trong dsSo có lớn 5 không?
bool kq = dsSo.All(x => x > 5);
//Tất cả các sản phẩm trong nhóm sp có chứa chữ ‘u’
List dssp = new List {
new Sanpham { Tensp = "Xà lách", Nhomsp="Rau cải" },
new Sanpham { Tensp = "Cua biển", Nhomsp="Hải sản" },
new Sanpham { Tensp = "Đậu xanh", Nhomsp="Ngũ cốc" } ,
new Sanpham { Tensp = "Tôm càng", Nhomsp="Hải sản" }
};
var query = dssp.GroupBy(x => x.Nhomsp)
.Where(x => x.All( y=> y.Tensp.Contains('u')));
- Any: Xác định sequence có chứa element nào thỏa điều kiện không. Trả về kiểu bool.
//Xem dsSo có element nào không?
bool kq = dsSo.Any(); //true
//Trong nhóm sản phẩm tồn tại ít nhất 1 s.phẩm chứa chữ 'u'
var query = dssp.GroupBy(x => x.Nhomsp)
.Where(x => x.Any(y => y.Tensp.Contains('u')));
- Contains: Xác định sequence có chứa element nào không dựa trên giá trị truyền vào. Trả về kiểu bool
(xem thêm ví dụ trên)
bool kq = dsChuoi.Contains("Tâm"); //True
- SequenceEqual: Xác định 2 sequence có bằng nhau không. Trả về kiểu bool.
string[] dsA = { "cherry", "apple", "blueberry" };
string[] dsB = { "apple", "blueberry", "cherry" };
bool kq = dsA.SequenceEqual(dsB); //False
- Generation LINQ (phát sinh):
- Empty: Trả về một IEnumerable rỗng có tham số được định kiểu.
//Phát sinh một IEnumerable rỗng
IEnumerable empty = Enumerable.Empty();
- Range: Phát sinh một sequence chứa các số nguyên trong một miền giá trị xác định.
//Phát sinh một IEnumerable có 3 số nguyên, bắt đầu từ 4
IEnumerable squares = Enumerable.Range(4, 3).Select(x => x * x);
//Nếu in kết quả ra màn hình, ta thấy là: 16 25 36
- Repeat: Phát sinh một sequence chứa một giá trị được lặp lại.
//Phát sinh một IEnumerable chứa 10 chuỗi “Tôi thích lập trình”
IEnumerable sts = Enumerable.Repeat("Tôi thích lập trình", 10);
Kết: Trên đây là các phương thức cơ bản của LINQ sử dụng trong truy vấn tới các Object của dotNet. Thành thạo các phương thức này sẽ giúp các coder nhanh chóng xử lý những tác vụ và giới hạn các object dotNet không cho phép làm trong một câu lệnh. Như Array thì không thể sắp xếp, hay ArrayList thì không thể lấy ra phần tử có giá trị lớn nhất, v.v... Chúc các bạn sớm rành LINQ.
Xem lại Phần một: LinQ la gi ?
HAPPY CODING :))