Để trả lời câu hỏi đã chỉnh sửa: tóm lại, có ích khi sử dụng LINQ bất cứ khi nào bạn phải thực hiện chức năng "truy vấn" (đó là những gì Q trong LINQ đại diện cho). Xác định một miền chính xác là khó, nhưng nó đơn giản hóa rất nhiều nhiệm vụ liên quan đến trích xuất và thao tác dữ liệu từ các bộ sưu tập.
Để giải thích một chút, rất nhiều chức năng truy vấn đã được đưa trực tiếp vào ngôn ngữ (hay đúng hơn là các trình triển khai LINQ khác nhau), do đó, tất cả những thứ như tổng hợp, đặt hàng, nhóm, lọc, chiếu, tham gia (và nhiều hơn nữa) đều được xử lý cho bạn. Các giải pháp dựa trên LINQ cũng thường ngắn hơn nhiều so với việc bạn thực hiện chúng "bằng tay" và cũng truyền đạt ý định của chúng tốt hơn nhiều.
Một ví dụ đơn giản thường giúp truyền tải sức mạnh của LINQ là hiển thị nội dung của một thư mục, được nhóm theo phần mở rộng. Chạy qua một triển khai bắt buộc điển hình trong đầu của bạn - sẽ có rất nhiều chi tiết thực hiện ngay từ đầu. Có lẽ chúng ta sẽ sử dụng một Dictionary<String, List<String>>
để lập chỉ mục các tệp theo phần mở rộng. Tất nhiên, chúng ta sẽ phải kiểm tra xem một khóa đã tồn tại chưa, khởi tạo một danh sách, thêm vào nó, v.v. Nó có thể đi một cái gì đó như:
Dictionary<string, List<string>> fileGroups = new Dictionary<string, List<string>>();
foreach (string file in Directory.GetFiles(Environment.CurrentDirectory))
{
string extension = Path.GetExtension(file).ToLower();
if (!fileGroups.ContainsKey(extension))
{
fileGroups[extension] = new List<string>();
}
fileGroups[extension].Add(file);
}
Hãy xem xét tương đương LINQ:
var query = from file in Directory.GetFiles(Environment.CurrentDirectory)
group file by Path.GetExtension(file).ToLower();
Lưu ý rằng bản thân truy vấn chỉ có 2 dòng, chắc chắn ngắn hơn bất kỳ giải pháp bắt buộc nào chúng tôi có thể đưa ra. Nó cũng khá dễ đọc; tỷ lệ tín hiệu trên tạp âm cao hơn so với giải pháp đầu tiên. Đối với những người mới sử dụng LINQ, bạn sẽ xuất kết quả của truy vấn đó như sau:
foreach (var fileGroup in query)
{
Console.WriteLine(String.Format("*** Files with extension: {0}", group.Key));
foreach (string file in fileGroup)
{
Console.WriteLine(file);
}
}
Với các ví dụ phức tạp hơn, sự khác biệt thường trở nên lớn hơn (ví dụ, chỉ xem xét nhóm theo nhiều trường). Vì vậy, để tóm tắt, LINQ giải quyết nhiều vấn đề truy vấn dữ liệu "hàng ngày" theo cách thường ngắn hơn và tự mô tả nhiều hơn. Điều này có chi phí nhẹ khi phải học cú pháp và công nghệ, nhưng lợi ích vượt xa các tiêu cực.