بایگانی

Posts Tagged ‘Lambda Expression’

Lambda Expression

مارس 16, 2010 2 دیدگاه

در Lambda Expression ،پارامترها با استفاده از کاما (‘,’) از یکدیگر جدا می شوند، به دنبال آن عملگر Lambda و به دنبال آن بلاکی از عبارت و یا دستورات.

  • اگر پارمترها بیش از یکی باشد، آنها را داخل پرانتز می گذاریم
  • عملگر Lambda علامت ‘=>’ می باشد

بنابراین یک Lambda Expression به صورت زیر خواهد بود

(param1, param2, …paramN) => expr

یا وقتی پیچیدگی بیشتری وجود داشته باشد، بلاک دستورات به صورت زیر خواهد بود

(param1, param2, …paramN) =>

{

statement1;

statement2;

statementN;

return(lambda_expression_return_type);

}

در این مثال، نوعی که برگردانده می شود باید با نوعی که توسط delegate مشخص می شود همخوانی داشته باشد.برای مثال در Lambda Expression زیر:

x => x

این عبارت می تواند به صورت x میرود به x و یا ورودی x برمیگرداند x را خوانده شود.چیزی که در اینجا باید به آن توجه کرد این است که در delegate مورد استفاده چه نوع و چه تعداد ورودی دریافت و چه نوع خروجی برگردانده می شود.برای مثال اگر در این مثال delegate به این صورت تعریف شده باشد که یک string را دریافت و یک bool را برمی گرداند، استفاده از این عبارت اشتباه خواهد بود چرا که اگر x را string فرض کنیم(که در اینجا با توجه به نوع ورودی delegate با آن برخورد می شود)، خروجی نخواهد توانست x باشد.عبارت سمت راست عملگر Lambda باید با ارزش و مقدار bool را برگرداند.مانند عبارت زیر

x => x.Length > 0

در مورد پارامترهای بیشتر می توان به صورت زیر نوشت

(x, y) => x == y

و در صورت وجود پیچیدگی و بلاک دستورات به صورت زیر

(x, y) =>

{

if (x > y)

return (x);

else

return (y);

}

برای اینکه ذهنتان با موضوع بیشتر آشنا شود، مثال پست قبل را با تعریف همان delegate و استفاده از Lambda Expression اصلاح می کنیم.

Delegate زیر توسط یک توسعه دهنده کد نوشته می شود

delegate bool IntFilter(int i);

حالا یک توسعه دهنده Application می تواند یک Lambda Expression بنویسد که پارامتر نوع int را به عنوان ورودی گرفته و خروجی آن از نوع bool خواهد بود.

بنابراین Lamda Expression به صورت زیر خواهد بود

int[] nums = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

int[] oddNums = Common.FilterArrayOfInts(nums, i => ((i & 1) == 1));

foreach (int i in oddNums)

Console.WriteLine(i);

خروجی این تکه کد همانند خروجی های قبلی است با این تفاوت که این تکه کد بسیار مختصرتر از مثال های قبل است.برای مرور هر سه روش را در زیر مشاهده می کنید که همگی یک کار را انجام میدهند

int[] oddNums = // using named method

Common.FilterArrayOfInts(nums, Application.IsOdd);

int[] oddNums = // using anonymous method

Common.FilterArrayOfInts(nums, delegate(int i) { return ((i & 1) == 1); });

int[] oddNums = // using lambda expression

Common.FilterArrayOfInts(nums, i => ((i & 1) == 1));


Vote on iDevCenter

دسته‌ها:C#.Net برچسب‌ها: , ,