מדריך LINQ – תחביר LINQ
Extension Methods
את Extension Methods ראינו כבר בחלק הקודם, נראה עוד דוגמה אחת יחסית מורכבת, נניח שאנחנו רוצים לחפש את כל התיקיות שיש להם מעל 10 קבצים ולפחות קובץ אחד גדול יותר מ – 20 KB, בנוסף נרמה לייצר מחלקה משלנו ולא להחזיר אובייקט של DirectoryInfo.
נגדיר מחלקה שנראת כך:
class MyDirectoryInfo { public int FileNumbers { get; set; } public string DirectoryName { get; set; } } var x1 = Directory.GetDirectories("path", "", SearchOption.AllDirectories) .Select(x => new DirectoryInfo(x)) .Where(x => { var files = x.GetFiles(); return files.Length >= 10 && files.Any(fi => fi.Length > 10); }) .Select(x => new MyDirectoryInfo() { DirectoryName = x.Name, FileNumbers = x.GetFiles().Length });
במידה ולא היה לנו מחלקה שנקראת MyDirectoryInfo יכולנו להחזיר Anonymous Types.
Syntactic sugar
כדי להקל על הכתיבה (לפעמים) אפשר לכתוב (חלק) משאילתות LINQ בתחביר אחר. נתחיל עם משהו פשוט יחסית, מציאת כל העובדים שהמשכורת שלהם קטנה מ – 2000
class Employee { public string Name { get; set; } public double Salary { get; set; } }
בתחביר הקודם היינו כותבים קוד כזה:
List<Employee> listEmp = GetList(); var lowSalary = listEmp.Where(x => x.Salary < 2000);
בתחביר החדש ניתן לכתוב כך
var lowSalary = from n in listEmp where n.Salary < 2000 select n;
את השאילתא המורכבת (של הקבצים) ניתן לתרגם לזה
var directories = from n in Directory.GetDirectories("path", "",SearchOption.AllDirectories) let di = new DirectoryInfo(n) let files = di.GetFiles() where files.Length >= 10 && files.Any(x => x.Length > 10) select new MyDirectoryInfo() { DirectoryName = di.Name, FileNumbers = files.Length };
פורסם במקור בבלוג של שלמה גולדברג (הרב דוטנט) – מרצה ויועץ במכללת סלע
תגובות בפייסבוק