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

من متد GetTeenAgerStudent() را به عنوان متد توسعه را به صورت زیر پیاده سازی میکنم:

اگر بخواهم دو دانش آموز اول را نه همه را بگیرم، اینطور است:

و خروجی به صورت زیر خواهد بود:

عالی است، همانطور که انتظار می رود کار می کند، اما اگر برنامه ابتدا همه دانش آموزان را پردازش کند و سپس دو دانش آموز اول ما را بگیرد، روند ما ، تا رسیدن به دو دانش آموز با چند حالت پرس و جو مواجه میشود؟(این روند در تعداد بالای رکورد ها بسیار هزینه زمان و پردازش دارد)

بنابراین، من مقداری کد برای ردیابی آن اضافه می کنم. متد توسعه را به صورت زیر بهینه میکنم:

و خروجی :

پاسخ این است که همه دانش آموزان را پردازش می کند و سپس دو دانش آموز اول را می گیرد 🤢 اما این برای عملکرد خوب نیست، اگر من با داده های بزرگ سروکار داشته باشم این بسیار هزینه بر خواهد بود.

برای بهبود کد ما با استفاده از کلمه کلیدی Yield استفاده میکنیم، اگر کارایی Yield را نمی‌دانید می‌توانید مستندات آن را ببینید

و خروجی چگونه است؟

می بینیم که نام دو بار پشت هم نمایش داده می شود، نه amr و سپس Johan این به این دلیل است که عبارت  yield هر عنصر را در هر بار اجرا برمی گرداند.

دومین موردی که به آن توجه می کنیم این است که پس از آن همه پردازش های داده دو دانش آموز اول را نمی گیرند، بلکه پردازش ها را تا رسیدن به 2 دانش آموز انجام می دهند و چیز دیگری که ما از فیلد موقت (IList<Student> Students) برای نوشتن کد بهتر استفاده می کنیم.

یک چیز مهم برای yield کمک به دستیابی به اجرای معوق است

اجرای معوق به این معنی است که ارزیابی یک عبارت تا زمانی که مقدار واقعی آن مورد نیاز باشد به تأخیر می افتد. با اجتناب از اجرای غیر ضروری، عملکرد را تا حد زیادی بهبود می بخشد.

اگر این کد را بدون foreach یا .ToList اجرا کنیم، چیزی چاپ نمی شود

کد تا قبل از foreach یا .tolist در انتهای خط اجرا نمی‌شود، اما بدون بازگشت Yield، بلافاصله اجرا می‌شود، اگرچه من teenAgerStds را مصرف نکردم.

در پایان، من می دانم که می توانم به جای همه اینها از کجا استفاده کنم و کد به این صورت خواهد بود

اما، من می خواهم نشان دهم که Whereچگونه کار می کند و Yield را برای ساخت کد بهتر درک کنید.

 

منبع : medium.com