چرا باید از LINQ استفاده کنیم؟
برای درک اینکه چرا باید از LINQ استفاده کنیم، به مثال هایی که در زیر قرار داده ایم توجه کنید. فرض کنید میخواهید دانش آموزان نوجوان را از داخل آرایه ای از نوع Student پیدا کنید.
قبل از سی شارپ نسخه 2.0، ما مجبور بودیم تا از یک حلقه foreach و یا for برای پیدا کردن آیتم های مورد نظر در یک مجموعه استفاده کنیم. برای مثال کد نوشته شده برای سناریو گفته شده در بالا به این صورت خواهد بود:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | class Student { public int StudentID { get; set; } public String StudentName { get; set; } public int Age { get; set; } } class Program { static void Main(string[] args) { Student[] studentArray = { new Student() { StudentID = 1, StudentName = "John", Age = 18 }, new Student() { StudentID = 2, StudentName = "Steve", Age = 21 }, new Student() { StudentID = 3, StudentName = "Bill", Age = 25 }, new Student() { StudentID = 4, StudentName = "Ram" , Age = 20 }, new Student() { StudentID = 5, StudentName = "Ron" , Age = 31 }, new Student() { StudentID = 6, StudentName = "Chris", Age = 17 }, new Student() { StudentID = 7, StudentName = "Rob",Age = 19 }, }; Student[] students = new Student[10]; int i = 0; foreach (Student std in studentArray) { if (std.Age > 12 && std.Age < 20) { students[i] = std; i++; } } } } |
همانطور که مشاهده میکنید استفاده از حلقه ها خوانایی کد را کاهش می دهد. نسخه 2.0 زبان C# نوع جدید به اسم delegate را معرفی کرد که با کمک آن می توان سناریو بالا را به صورت زیر نوشت:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | delegate bool FindStudent(Student std); class StudentExtension { public static Student[] where(Student[] stdArray, FindStudent del) { int i=0; Student[] result = new Student[10]; foreach (Student std in stdArray) if (del(std)) { result[i] = std; i++; } return result; } } class Program { static void Main(string[] args) { Student[] studentArray = { new Student() { StudentID = 1, StudentName = "John", Age = 18 } , new Student() { StudentID = 2, StudentName = "Steve", Age = 21 } , new Student() { StudentID = 3, StudentName = "Bill", Age = 25 } , new Student() { StudentID = 4, StudentName = "Ram" , Age = 20 } , new Student() { StudentID = 5, StudentName = "Ron" , Age = 31 } , new Student() { StudentID = 6, StudentName = "Chris", Age = 17 } , new Student() { StudentID = 7, StudentName = "Rob",Age = 19 } , }; Student[] students = StudentExtension.where(studentArray, delegate(Student std){ return std.Age > 12 && std.Age < 20; }); } } } |
همانطور که مشاهده می کنید با معرفی شدن delegate ها کمی وضعیت بهتر شد. اما با انتشار نسخه 3.0 سی شارپ، قابلیت های جدیدی به این زبان اضافه شد که از جمله آن ها می توان به extension method، lambda expression، expression tree، anonymous type، و query expression اشاره کرد. ویژگی های ذکر شده بلوک های سازنده LINQ محسوب می شوند. حال اگر بخواهیم همان سناریو بالا را با استفاده از LINQ پیادهسازی کنیم، به این صورت خواهد بود:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | class Program { static void Main(string[] args) { Student[] studentArray = { new Student() { StudentID = 1, StudentName = "John", age = 18 } , new Student() { StudentID = 2, StudentName = "Steve", age = 21 } , new Student() { StudentID = 3, StudentName = "Bill", age = 25 } , new Student() { StudentID = 4, StudentName = "Ram" , age = 20 } , new Student() { StudentID = 5, StudentName = "Ron" , age = 31 } , new Student() { StudentID = 6, StudentName = "Chris", age = 17 } , new Student() { StudentID = 7, StudentName = "Rob",age = 19 } , }; // Use LINQ to find teenager students Student[] teenAgerStudents = studentArray.Where(s => s.age > 12 && s.age < 20).ToArray(); // Use LINQ to find first student whose name is Bill Student bill = studentArray.Where(s => s.StudentName == "Bill").FirstOrDefault(); // Use LINQ to find student whose StudentID is 5 Student student5 = studentArray.Where(s => s.StudentID == 5).FirstOrDefault(); } } |
مزایای استفاده از LINQ
- زبان آشنا: توسعه دهندگان مجبور نیستند برای کار بر روی منبع داده جدید، زبان کوئری نویسی جدیدی یاد بگیرند.
- کد کمتر: با استفاده از LINQ می توانید، کد های قبلی که برای هدف مشابه نوشته شده اند را تا حد زیادی فشرده کنید
- خوانایی بیشتر: کدهای نوشته شده با LINQ از خوانایی خیلی بالایی برخوردار هستند. بنابراین سایر توسعه دهندگان می تواند به راحتی آن را متوجه شوند.
- یک روش استاندارد برای کار بر روی انواع منبع داده: کوئری نوشته شده با LINQ را می تواند بدون تغییر بر روی چندین منبع داده استفاده کرد.
- بررسی شدن کوئری ها در زبان کامپایل: کامپایلر می تواند خطاهای موجود در کوئری را در زمان کامپایلر تشخیص دهد.
- بازیابی اطلاعات در شکل های مختلف
- پشتیبانی IntelliSense
هیچ نظری ثبت نشده است