PDA

نسخه کامل مشاهده نسخه کامل : جای عبارت Lambda?



Life24
25-12-2013, 09:35
سلام،
وقت بخیر

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
جسارتا جای این عبارت n=>n%2==1
اگر بخواهیم از delegate استفاده کنیم با با تابع معمولی بنویسیم باید چی کار کنیم؟
آخه ما n رو هم تعریف نکردیم.میخواهم ببینم دقیقا چه اتفاقی داره پشت پرده میافته؟
اصلا یک همچین چیزی رو بخواهیم خودمون بنویسیم(منظورم where )هست باید چه کنیم؟

Xeoc
26-12-2013, 20:57
اگر بخواهیم از delegate استفاده کنیم
....


عبارات lambda هم به صورت دلگیت استفاده میشند منتها نه به صورت روش قدیمی که ابتدا با کلمه delegate یک امضایی از یک متد تعریف می کدیم و بعد متد موردنظر رو بهش می دادیم.
در کد شما در تابع where برای ایجاد دلگیت برای عبارت lambda از نوع داده Func استفاده می کنیم با این امضاء:


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

در عبارت بالا پارامتر اولی از نوع int مقدار ورودی است که میشه همون مقدار n در عبارت lambda ، و پارمتر دومی از نوع bool نوع بازگشتی تابع (عبارت lambda) است. بدنه تابع هم عبارت n % 2 == 1 هستش و درصورتی که باقیمانده یک بشه خروجی true و درغیر اینصورت false است.


...
با تابع معمولی بنویسیم باید چی کار کنیم؟
خب این تقریبا کار اشتباهیه تا وقتی که می تونید از عبارات تر و تمیز lambda استفاده کنید چه دلیلی وجود داره که بخواید از توابع معمولی که باعث پیچیده شدن و افرایش کد میشه استفاده کنید؟ مخصوصا الان که دارید از linq استفاده میکنید . برای linq بهترین روش همین lambda هستش.
به هر حال به این صورت می تونید بنویسید:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

روشی که در عبارت بالا به کار گرفته شده دقیقا معادل عبارت lambda شما هست.


آخه ما n رو هم تعریف نکردیم.

شما n رو تعریف کردی به وسیله این دستور:


n => n % 2 == 1

همیشه قبل از <= پارامترها رو تعریف می کنیم.

در کل گه بخوام معادل این عبارت lambda رو در قالب تابع معمولی نشون بدم :

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید



اصلا یک همچین چیزی رو بخواهیم خودمون بنویسیم(منظورم where )هست باید چه کنیم؟

خارج از حوصله این بحثه اما یه سری مباحث وجود داره مثل جنریک ها ، توابع بدون نام و .... که باید اینها رو یاد بکیرید تا بتونید چنین چیزی رو که خیلی هم راحت هست رو پیاده سازی کنید.

یه سری لینک می زارم حتما مطالعه کنید:
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

_H2_
06-01-2014, 23:25
سلام
تاپیکتان را قبلا دیدم و سوالاتان را ذخیره کردم و سرفرصت جوابی دهم...
حالا دوستمان Xeoc لطف کرده و جواب دادند که صحیح هم است ولی چون قبلاً تایپ کردم گفتم دیگر حیف است!



اگر بخواهیم از delegate استفاده کنیم با با تابع معمولی بنویسیم باید چی کار کنیم؟
میخواهم ببینم دقیقا چه اتفاقی داره پشت پرده میافته؟

کامپایل عبارت n => n % 2 == 1 شما را به یک تابع تبدیل میکند:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

در واقع این دو کد زیر کاملاً برابر هستند
بخش از کد اولی را کامپایلر جای ما تایپ میکند!

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید



آخه ما n رو هم تعریف نکردیم

ضمنی از جنس int تعریف شده
اگر تعریف نشده بود شما نمیتوانستید باقیمانده اش را محاسبه کنید

در واقع در حال حاضر تابع where یک delegate از نوع <Func<int,bool می خواهد ...
یعنی یک تابع که ورودی int و خروجی bool دارد، پس ورودی و خروجی عبارت Lambda مورد نیاز مشخص است؟! اینطور نیست؟! فقط کافیست کدش را بنویسید.



اصلا یک همچین چیزی رو بخواهیم خودمون بنویسیم(منظورم where )هست باید چه کنیم؟


هیچ جای تردید و ابهام و پنهان کاری و خط ویژه ای وجود ندارد...
منظورم آن است که خودتان هم بسادگی میتوانید این توابع یا توابع مشابه را بنویسید و مایکروسافت برای نوشتن این توابع هیچ خط ویژه ای برای خود قائل نشده

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

موفق باشید.