مشخصات مقاله
-
1240
-
0.0
-
4778
-
0
-
0
آموزش Projection با متدهای الحاقی Select و SelectMany
کلیه حقوق مادی و معنوی این مقاله متعلق به آموزشگاه تحلیل داده می باشد و هر گونه استفاده غیر قانونی از آن پیگرد قانونی دارد.
عملیات انتخاب و تبدیل (Projection با متدهای الحاقی Select و SelectMany)
با projection می توان یک شی را به نوع دیگری تبدیل کرد که دربردارنده ی property های مورد نظر از شی ذکر شده باشند. بنابراین projection به شما این امکان را می دهد تا یک نوع جدیدی ایجاد کنید که از هر شی موجود در مجموعه ساخته شده است.
به عنوان مثال می توان یک property از شی را اتنخاب کرد و سپس عملیات ریاضی بر روی آن انجام داد. همچنین می توان عملیات projection را پیاده سازی کرد بدون اینکه تغییری در شی اصلی ایجاد گردد.
عملگرهای projection با شرح کاربرد در جدول زیر نمایش داده شده است:
|
اسم متد |
شرح عملکرد |
ساختار نگارشی عبارت کوئری در زبان C# |
ساختار نگارشی عبارت کوئری در زبان VB |
اطلاعات بیشتر |
|
Select |
این متد بر اساس عبارت مشخص شده در دستور Select، عناصری را از المان های مجموعه ی مورد پرس و جو انتخاب کرده و در خروجی برمی گرداند (برای مثال حروف اول هر رشته را از یک آرایه گزینش و واکشی می نماید). |
select |
Select |
Enumerable.Select Queryable.Select |
|
SelectMany |
این متد بر اساس دستور تعریف شده در عبارت SelectMany، المان هایی را از مجموعه ی مورد پرس و جو انتخاب کرده و در خروجی برمی گرداند (برای مثال یک آرایه از نوع رشته را به عنوان ورودی گرفته و المان های آن را از یکدیگر جدا می کند و سپس آن ها را به صورت تفکیک شده در خروجی بازمی گرداند). |
Use multiplefrom clause (استفاده از چندین عبارت from) |
Use multipleFrom clauses (استفاده از چندین عبارت From) |
Enumerable.SelectMany Queryable.SelectMany |
مثال
متد select
List<string>words = new List<string>() { "an", "apple", "a", "day" };
var query = from word in words
select word.Substring(0, 1);
foreach (string s in query)
Console.WriteLine(s);
همان طور که مشاهده می کنید، این کوئری با استفاده از select یک لیست را به عنوان ورودی گرفته و حروف اول المان های آن (که از نوع رشته هستند) را در خروجی به نمایش گذاشته است.
متد SelectMany
مثال ارائه شده در زیر با استفاده از متد SelectMany از چندین عبارت from برای تفکیک کلمات لیست (از نوع رشته) و نمایش آن در خروجی بهره گرفته است.
List<string>phrases = new List<string>() { "an apple a day", "the quick brown fox" };
var query = from phrase in phrases
from word in phrase.Split(' ')
select word;
foreach (string s in query)
Console.WriteLine(s);
مقایسه ی Select با SelectMany
هر دو متد نام برده در بالا، المان یا المان هایی را از مجموعه انتخاب کرده و در خروجی برمی گرداند. تابع Select() تنها یک مقدار بازگشتی به ازای هر المان موجود در مجموعه ی مورد پرس و جو برمی گرداند. خروجی این متد عملا یک مجموعه است که از نظر تعداد المان با منبع داده یا مجموعه ی مورد پرس و جو یکسان است. در مقابل آن، متد SelectMany قرار دارد که یک خروجی واحد و کلی متشکل از زیرمجموعه ای به هم پیوسته از (تک تک) المان های منبع داده می باشد. تابعی که به عنوان پارامتر به SelectMany ارسال می شود، می بایست یک دنباله ی شمارشی (enumerable) از مقادیر را به ازای هر المان موجود در منبع داده برگرداند. این دنباله های شمارشی سپس توسط تابع SelectMany به هم پیوند داده شده و در نتیجه یک دنباله ی کامل و طولانی را ایجاد می کند.
تصویر زیر تفاوت بین عملیاتی که توسط این دو متد اجرا می شود را به نمایش گذاشته است. در هر دو مورد، selector آرایه ای از گل ها را از هر منبع برمی گرداند.
همان طور که از تصویر مشاهده می شود، Select() مجموعه ای را برگردانده که از نظر تعداد المان با مجموعه منبع یا ورودی یکسان می باشد.
این تصویر نمایش می دهد چگونه دستور SelectMany() دنباله ای از آرایه ها که بلافاصله در مجاورت هم قرار دارند را قالب در یک نتیجه ی کلی و نهایی می گنجاند که دربرگیرنده ی تک تک مقادیر موجود در تک تک آرایه های مجاور می باشد.
نمونه کد
مثال زیر عملکرد دو متد Select() و SelectMany() را با یکدیگر مقایسه می کند. این کد با انتخاب دو آیتم اول از هر لیست از اسم گل های موجود در مجموعه ی ورودی، یک دسته گل (bouquet) ایجاد می کند.
در نمونه ی حاضر، مقداری که متد مزبور به عنوان پارامتر می پذیرد (Select<TSource, TResult>(IEnumerable<TSource>, Func<TSource, TResult>))، خود یک مجموعه از مقادیر می باشد. برای شمردن هر رشته داخل هر زیر دنباله و چاپ کردن مقادیر این مجموعه ملزوم به استفاده از یک حلقه ی اضافی foreach هستم.
class Bouquet
{
public List<string>Flowers { get;set;}
}
static void SelectVsSelectMany()
{
List
new Bouquet { Flowers = new List<string>{ "sunflower", "daisy", "daffodil", "larkspur" }},
new Bouquet{ Flowers = new List<string>{ "tulip", "rose", "orchid" }},
new Bouquet{ Flowers = new List<string>{ "gladiolis", "lily", "snapdragon", "aster", "protea" }},
new Bouquet{ Flowers = new List<string>{ "larkspur", "lilac", "iris", "dahlia" }}
};
// *********** Select ***********
IEnumerable<>string>>query1 = bouquets.Select(bq =>bq.Flowers);
// ********* SelectMany *********
IEnumerable<string>query2 = bouquets.SelectMany(bq =>bq.Flowers);
Console.WriteLine("Results by using Select():");
// Note the extra foreach loop here.
foreach (IEnumerable
foreach (string item in collection)
Console.WriteLine(item);
Console.WriteLine("\nResults by using SelectMany():");
foreach (string item in query2)
Console.WriteLine(item);
}