در ادامهی سری آموزشی LINQ، عملگرهای پرس و جوی مرتب سازی، گروه بندی و مجموعه را بررسی خواهیم کرد.
عملگرهای مرتب سازی Ordering Operators
این عملگرها عناصر توالی ورودی را به خروجی ارسال میکنند؛ با این تفاوت که توالی خروجی مرتب شده، توالی ورودی است.
عملگر OrderBy
این عملگر توالی ورودی را بر اساس کلیدی که مشخص میکنیم مرتب میکند.
مثال:
در این مثال کلید معرفی شدهی توسط عبارت Lambda، یک رشته است.
خروجی مثال بالا:
همان طور که ملاحظه میکنید، عملگر OrderBy بهصورت پیش فرض مرتب سازی عناصر را صعودی انجام داده است.
عبارت Lambda استفاده شده میتواند یک خاصیت از عناصر تشکیل دهندهی توالی ورودی باشد.
مثال:
خروجی مثال بالا:
همانطور که مشاهده میکنید توالی خروجی، بر اساس خصوصیت کالری توالی ورودی مرتب شده و در خروجی نمایش داده شده است.
پیاده سازی توسط عبارتهای جستجو
در عبارتهای پرس و جو، کلمه کلیدی orderby برای مرتب سازی توالی استفاده میشود:
مثال:
عملگر ThenBy
این عملگر میتواند به صورت زنجیرهای، یک یا چندین بار بعد از عملگر OrderBy در پرس و جو، مورد استفاده قرار گیرد. توسط عملگر ThenBy میتوان سطوح دیگری از مرتب سازی را اعمال کرد. در مثال زیر ابتدا توالی ورودی را بر اساس کالری و بعد از آن بر اساس نام مرتب خواهیم کرد.
مثال :
خروجی مثال بالا:
در اینجا در توالی ورودی، Milk قبل از Egg قرار دارد. ولی به خاطر استفاده از عملگر ThenBy، در مواردی که کالری عناصر یکسان است، بر اساس نام عناصر توالی، مرتب سازی انجام شده است.
پیاده سازی توسط عبارتهای جستجو
همانطور که مشاهده میکنید برای مرتب سازی بر اساس خصوصیات دیگر کافیست نام خصوصیت را بعد از اولین عنصر، به وسیلهی کاما (,) قید کنید.
عملگر OrderByDescending
این عملگر همچون عملگر OrderBy عمل میکند؛ اما توالی ورودی را بر اساس کلید داده شده، به صورت نزولی مرتب میکند.
مثال:
خروجی مثال بالا:
پیاده سازی توسط عبارتهای جستجو
جایگزین عملگر OrderByDescending در عبارتهای جستجو، کلمهی کلیدی descending میباشد:
عملگر ThenByDescending
این عملگر بصورت زنجیرهای بعد از عملگرهای دیگر میآید و مرتب سازی را بهصورت نزولی انجام میدهد.
مثال:
خروجی مثال بالا:
در این مثال در توالی ورودی، Flour قبل از Sugar آمده است. اما به خاطر عملگر ThenOrderByDescending ترتیب قرار گیری آنها در توالی خروجی تغییر کرده است.
پیاده سازی توسط عبارتهای جستجو
در عبارتهای جستجو نیز برای رسیدن به خروجی مشابه کد بالا از کلمهی کلیدی descending استفاده میکنیم.
عملگر Reverse
عملگر Reveres توالی ورودی را دریافت کرده و آن را معکوس و سپس توالی خروجی را تولید میکند. اولین عنصر توالی ورودی، آخرین عنصر توالی خروجی میباشد.
مثال:
خروجی مثال بالا:
پیاده سازی توسط عبارتهای جستجو
معادل این عملگر، کلمهی کلیدی دیگری در عبارتهای جستجو وجود ندارد و ترکیب دو روش میتواند خروجی دلخواه را تولید کند.
عملگرهای گروه بندی Grouping Operator
عملگر GroupBy
در مثال فوق خروجی تابع GroupBy یک لیست قابل شمارش از نوع IGrouping میباشد. هر عنصر IGrouping شامل یک کلید (در اینجا کالری مواد غذایی) و لیستی از مواد غذایی که کالریهای یکسانی دارند، میباشد.
خروجی مثال بالا:
پیاده سازی توسط عبارتهای جستجو
در بخش پنجم این سری آموزشی، روش گروه بندی توسط عبارتهای جستجو توضیح داده شده است.
عملگرهای مجموعه Set Operators
این عملگرها شامل موارد زیر میباشند:
• Concat
• Union
• Distinct
• Intersect
• Except
عملگر Concat
این عملگر دو توالی را با هم ادغام میکند؛ بطوریکه عناصر توالی دوم، بعد از عناصر توالی اول به توالی خروجی اضافه میشوند.
مثال:
خروجی مثال بالا :
توجه داشته باشید که در این حالت عناصر تکراری حذف نخواهند شد.
پیاده سازی توسط عبارتهای جستجو
معادل این عملگر، کلمهی کلیدی جدیدی در عبارتهای جستجو وجود ندارد و ترکیب دو روش میتواند خروجی دلخواه را تولید کند.
عملگر Union
این عملگر همچون عملگر Concat رفتار میکند؛ با این تفاوت که عناصر تکراری در توالی خروجی حضور نخواهند داشت.
مثال:
خروجی مثال بالا:
همانطور که مشاهده میکنید، عناصر Sugar و Pastry که در توالی دوم تکرار شده بودند، در خروجی وجود ندارند.
پیاده سازی توسط عبارتهای جستجو
معادل این عملگر، کلمهی کلیدی جدیدی در عبارتهای جستجو وجود ندارد و ترکیب دو روش میتواند خروجی دلخواه را تولید کند.
عملگر Distinct
این عملگر عناصر تکراری توالی را حذف میکند. این عملگر هم میتواند بر روی یک توالی اجرا شود و هم میتواند بصورت زنجیرهای بعد از عملگرهای دیگر بکار برود.
مثال: استفاده از این عملگر بر روی یک توالی:
در مثال بالا، عناصر تکراری در توالی ورودی را، از طریق عملگر Distinct حذف کردهایم.
خروجی مثال بالا:
مثال: بکارگیری عملگر Distinct بهمراه عملگر Concat برای شبیه سازی عملیات Union
خروجی مثال بالا:
همانطور که مشاهده میکنید خروجی این مثال با حالت استفاده از Union تفاوتی ندارد.
پیاده سازی توسط عبارتهای جستجو
معادل این عملگر، کلمهی کلیدی جدیدی در عبارتهای جستجو وجود ندارد و ترکیب دو روش میتواند خروجی دلخواه را تولید کند.
عملگر Intersect
این عملگر عناصر مشترک بین دو توالی را باز میگرداند.
مثال:
خروجی مثال بالا:
نکته: عناصر تکراری فقط یکبار در خروجی ظاهر خواهند شد.
پیاده سازی توسط عبارتهای جستجو
معادل این عملگر، کلمهی کلیدی جدیدی در عبارتهای جستجو وجود ندارد و ترکیب دو روش میتواند خروجی دلخواه را تولید کند.
عملگر Except
این عملگر عناصری از توالی اول را انتخاب میکند که در توالی دوم همتایی نداشته باشند.
مثال:
خروجی مثال فوق:
نکته: هیچ عنصری از توالی دوم در خروجی وجود نخواهد داشت.
پیاده سازی توسط عبارتهای جستجو
معادل این عملگر، کلمهی کلیدی جدیدی در عبارتهای جستجو وجود ندارد و ترکیب دو روش میتواند خروجی دلخواه را تولید کند.
عملگرهای مرتب سازی Ordering Operators
این عملگرها عناصر توالی ورودی را به خروجی ارسال میکنند؛ با این تفاوت که توالی خروجی مرتب شده، توالی ورودی است.
عملگر OrderBy
این عملگر توالی ورودی را بر اساس کلیدی که مشخص میکنیم مرتب میکند.
مثال:
در این مثال کلید معرفی شدهی توسط عبارت Lambda، یک رشته است.
string[] ingredients = { "Sugar", "Egg", "Milk", "Flour", "Butter" }; var query = ingredients.OrderBy(x => x); foreach (var item in query) { Console.WriteLine(item); }
Butter Egg Flour Milk Sugar
عبارت Lambda استفاده شده میتواند یک خاصیت از عناصر تشکیل دهندهی توالی ورودی باشد.
مثال:
Ingredient[] ingredients = { new Ingredient {Name = "Sugar", Calories = 500}, new Ingredient {Name = "Egg", Calories = 100}, new Ingredient {Name = "Milk", Calories = 150}, new Ingredient {Name = "Flour", Calories = 50}, new Ingredient {Name = "Butter", Calories = 200}, }; var query = ingredients.OrderBy(x => x.Calories); foreach (var item in query) { Console.WriteLine(item.Name + " " + item.Calories); }
Flour 50 Egg 100 Milk 150 Butter 200 Sugar 500
پیاده سازی توسط عبارتهای جستجو
در عبارتهای پرس و جو، کلمه کلیدی orderby برای مرتب سازی توالی استفاده میشود:
مثال:
var query = from i in ingredients orderby i.Calories select i;
عملگر ThenBy
این عملگر میتواند به صورت زنجیرهای، یک یا چندین بار بعد از عملگر OrderBy در پرس و جو، مورد استفاده قرار گیرد. توسط عملگر ThenBy میتوان سطوح دیگری از مرتب سازی را اعمال کرد. در مثال زیر ابتدا توالی ورودی را بر اساس کالری و بعد از آن بر اساس نام مرتب خواهیم کرد.
مثال :
Ingredient[] ingredients = { new Ingredient {Name = "Sugar", Calories = 500}, new Ingredient {Name = "Milk", Calories = 100}, new Ingredient {Name = "Egg", Calories = 100}, new Ingredient {Name = "Flour", Calories = 500}, new Ingredient {Name = "Butter", Calories = 200}, }; var query = ingredients .OrderBy(x => x.Calories) .ThenBy(x => x.Name); foreach (var item in query) { Console.WriteLine(item.Name + " " + item.Calories); }
Egg 100 Milk 100 Butter 200 Flour 500 Sugar 500
پیاده سازی توسط عبارتهای جستجو
var query = from i in ingredients orderby i.Calories, i.Name select i;
عملگر OrderByDescending
این عملگر همچون عملگر OrderBy عمل میکند؛ اما توالی ورودی را بر اساس کلید داده شده، به صورت نزولی مرتب میکند.
مثال:
Ingredient[] ingredients = { new Ingredient {Name = "Sugar", Calories = 500}, new Ingredient {Name = "Egg", Calories = 100}, new Ingredient {Name = "Milk", Calories = 150}, new Ingredient {Name = "Flour", Calories = 50}, new Ingredient {Name = "Butter", Calories = 200}, }; var query = ingredients.OrderByDescending(x => x.Calories); foreach (var item in query) { Console.WriteLine(item.Name + " " + item.Calories); }
Sugar 500 Flour 500 Butter 200 Milk 100 Egg 100
پیاده سازی توسط عبارتهای جستجو
جایگزین عملگر OrderByDescending در عبارتهای جستجو، کلمهی کلیدی descending میباشد:
var query = from i in ingredients orderby i.Calories descending select i;
عملگر ThenByDescending
این عملگر بصورت زنجیرهای بعد از عملگرهای دیگر میآید و مرتب سازی را بهصورت نزولی انجام میدهد.
مثال:
Ingredient[] ingredients = { new Ingredient {Name = "Flour", Calories = 500}, new Ingredient {Name = "Sugar", Calories = 500}, new Ingredient {Name = "Egg", Calories = 100}, new Ingredient {Name = "Milk", Calories = 100}, new Ingredient {Name = "Butter", Calories = 200} }; var query = ingredients .OrderBy(x => x.Calories) .ThenByDescending(x => x.Name); foreach (var item in query) { Console.WriteLine(item.Name + " " + item.Calories); }
Milk 100 Egg 100 Butter 200 Sugar 500 Flour 500
پیاده سازی توسط عبارتهای جستجو
در عبارتهای جستجو نیز برای رسیدن به خروجی مشابه کد بالا از کلمهی کلیدی descending استفاده میکنیم.
var query = from i in ingredients orderby i.Calories, i.Name descending select i;
عملگر Reverse
عملگر Reveres توالی ورودی را دریافت کرده و آن را معکوس و سپس توالی خروجی را تولید میکند. اولین عنصر توالی ورودی، آخرین عنصر توالی خروجی میباشد.
مثال:
char[] letters = { 'A', 'B', 'C' }; var query = letters.Reverse(); foreach (var item in query) { Console.WriteLine(item); }
C B A
پیاده سازی توسط عبارتهای جستجو
معادل این عملگر، کلمهی کلیدی دیگری در عبارتهای جستجو وجود ندارد و ترکیب دو روش میتواند خروجی دلخواه را تولید کند.
عملگرهای گروه بندی Grouping Operator
عملگر GroupBy
این عملگر یک توالی ورودی را دریافت کرده و یک توالی گروه بندی شده را به خروجی ارسال میکند. پایهایترین امضاء متد GroupBy، یک عبارت Lambda میباشد .این عبارت، کلید گروه بندی توالی ورودی را مشخص میکند.
مثال: در این مثال قصد داریم مواد غذایی مختلف را بر اساس کالری آنها گروه بندی کنیم.Ingredient[] ingredients = { new Ingredient {Name = "Sugar", Calories = 500}, new Ingredient {Name = "Lard", Calories = 500}, new Ingredient {Name = "Butter", Calories = 500}, new Ingredient {Name = "Egg", Calories = 100}, new Ingredient {Name = "Milk", Calories = 100}, new Ingredient {Name = "Flour", Calories = 50}, new Ingredient {Name = "Oats", Calories = 50} }; IEnumerable<IGrouping<int, Ingredient>> query = ingredients.GroupBy(x => x.Calories); foreach (IGrouping<int, Ingredient> group in query) { Console.WriteLine("Ingredients with {0} calories", group.Key); foreach (Ingredient ingredient in group) { Console.WriteLine(" -{0}", ingredient.Name); } }
خروجی مثال بالا:
Ingredients with 500 calories -Sugar -Lard -Butter Ingredients with 100 calories -Egg -Milk Ingredients with 50 calories -Flour -Oats
پیاده سازی توسط عبارتهای جستجو
در بخش پنجم این سری آموزشی، روش گروه بندی توسط عبارتهای جستجو توضیح داده شده است.
عملگرهای مجموعه Set Operators
این عملگرها شامل موارد زیر میباشند:
• Concat
• Union
• Distinct
• Intersect
• Except
عملگر Concat
این عملگر دو توالی را با هم ادغام میکند؛ بطوریکه عناصر توالی دوم، بعد از عناصر توالی اول به توالی خروجی اضافه میشوند.
مثال:
string[] applePie = { "Apple", "Sugar", "Pastry", "Cinnamon" }; string[] cherryPie = { "Cherry", "Sugar", "Pastry", "Kirsch" }; IEnumerable<string> query = applePie.Concat(cherryPie); foreach (string item in query) { Console.WriteLine(item); }
Apple Sugar Pastry Cinnamon Cherry Sugar Pastry Kirsch
پیاده سازی توسط عبارتهای جستجو
معادل این عملگر، کلمهی کلیدی جدیدی در عبارتهای جستجو وجود ندارد و ترکیب دو روش میتواند خروجی دلخواه را تولید کند.
عملگر Union
این عملگر همچون عملگر Concat رفتار میکند؛ با این تفاوت که عناصر تکراری در توالی خروجی حضور نخواهند داشت.
مثال:
string[] applePie = { "Apple", "Sugar", "Pastry", "Cinnamon" }; string[] cherryPie = { "Cherry", "Sugar", "Pastry", "Kirsch" }; IEnumerable<string> query = applePie.Union(cherryPie); foreach (string item in query) { Console.WriteLine(item); }
Apple Sugar Pastry Cinnamon Cherry Kirsch
پیاده سازی توسط عبارتهای جستجو
معادل این عملگر، کلمهی کلیدی جدیدی در عبارتهای جستجو وجود ندارد و ترکیب دو روش میتواند خروجی دلخواه را تولید کند.
عملگر Distinct
این عملگر عناصر تکراری توالی را حذف میکند. این عملگر هم میتواند بر روی یک توالی اجرا شود و هم میتواند بصورت زنجیرهای بعد از عملگرهای دیگر بکار برود.
مثال: استفاده از این عملگر بر روی یک توالی:
string[] applePie = { "Apple", "Sugar", "Apple", "Sugar", "Pastry", "Cinnamon" }; IEnumerable<string> query = applePie.Distinct(); foreach (string item in query) { Console.WriteLine(item); }
خروجی مثال بالا:
Apple Sugar Pastry Cinnamon
مثال: بکارگیری عملگر Distinct بهمراه عملگر Concat برای شبیه سازی عملیات Union
string[] applePie = { "Apple", "Sugar", "Pastry", "Cinnamon" }; string[] cherryPie = { "Cherry", "Sugar", "Pastry", "Kirsch" }; IEnumerable<string> query = applePie.Concat(cherryPie).Distinct(); foreach (string item in query) { Console.WriteLine(item); }
Apple Sugar Pastry Cinnamon Cherry Kirsch
پیاده سازی توسط عبارتهای جستجو
معادل این عملگر، کلمهی کلیدی جدیدی در عبارتهای جستجو وجود ندارد و ترکیب دو روش میتواند خروجی دلخواه را تولید کند.
عملگر Intersect
این عملگر عناصر مشترک بین دو توالی را باز میگرداند.
مثال:
string[] applePie = { "Apple", "Sugar", "Pastry", "Cinnamon" }; string[] cherryPie = { "Cherry", "Sugar", "Pastry", "Kirsch" }; IEnumerable<string> query = applePie.Intersect(cherryPie); foreach (string item in query) { Console.WriteLine(item); }
Sugar Pastry
پیاده سازی توسط عبارتهای جستجو
معادل این عملگر، کلمهی کلیدی جدیدی در عبارتهای جستجو وجود ندارد و ترکیب دو روش میتواند خروجی دلخواه را تولید کند.
عملگر Except
این عملگر عناصری از توالی اول را انتخاب میکند که در توالی دوم همتایی نداشته باشند.
مثال:
string[] applePie = { "Apple", "Sugar", "Pastry", "Cinnamon" }; string[] cherryPie = { "Cherry", "Sugar", "Pastry", "Kirsch" }; IEnumerable<string> query = applePie.Except(cherryPie); foreach (string item in query) { Console.WriteLine(item); }
Apple Cinnamon
پیاده سازی توسط عبارتهای جستجو
معادل این عملگر، کلمهی کلیدی جدیدی در عبارتهای جستجو وجود ندارد و ترکیب دو روش میتواند خروجی دلخواه را تولید کند.