দক্ষতা
yield
শব্দ কার্যকরভাবে সংগ্রহে আইটেম উপর একটি অলস শুমার যে আরো অনেক দক্ষ হতে পারে তৈরি করে। উদাহরণস্বরূপ, যদি আপনার foreach
লুপটি 1 মিলিয়ন আইটেমের প্রথম 5 টি আইটেমের উপরে পুনরাবৃত্তি করে তবে তা সবই yield
ফিরে আসে এবং আপনি প্রথমে অভ্যন্তরীণভাবে 1 মিলিয়ন আইটেমের সংগ্রহ তৈরি করেন নি। একইভাবে আপনি ব্যবহার করতে চান yield
সঙ্গে IEnumerable<T>
আপনার নিজের প্রোগ্রামিং পরিস্থিতিতে আগমন মান একই দক্ষতাসম্পন্ন অর্জন করা।
একটি নির্দিষ্ট দৃশ্যে দক্ষতার উদাহরণ অর্জন
কোনও পুনরুক্তি পদ্ধতি নয়, একটি বড় সংগ্রহের সম্ভাব্য অদক্ষ ব্যবহার,
(মধ্যবর্তী সংগ্রহটি প্রচুর আইটেমযুক্ত তৈরি করা হয়)
// Method returns all million items before anything can loop over them.
List<object> GetAllItems() {
List<object> millionCustomers;
database.LoadMillionCustomerRecords(millionCustomers);
return millionCustomers;
}
// MAIN example ---------------------
// Caller code sample:
int num = 0;
foreach(var itm in GetAllItems()) {
num++;
if (num == 5)
break;
}
// Note: One million items returned, but only 5 used.
Iterator সংস্করণ, দক্ষ
(কোন মধ্যবর্তী সংগ্রহ নির্মিত হয় না)
// Yields items one at a time as the caller's foreach loop requests them
IEnumerable<object> IterateOverItems() {
for (int i; i < database.Customers.Count(); ++i)
yield return database.Customers[i];
}
// MAIN example ---------------------
// Caller code sample:
int num = 0;
foreach(var itm in IterateOverItems()) {
num++;
if (num == 5)
break;
}
// Note: Only 5 items were yielded and used out of the million.
কিছু প্রোগ্রামিং পরিস্থিতি সরল করুন
অন্য ক্ষেত্রে, তালিকাগুলি বাছাই এবং একত্রিতকরণের প্রোগ্রামগুলি প্রোগ্রামকে সহজ করে তোলে কারণ আপনি কেবলমাত্র yield
মধ্যবর্তী সংগ্রহগুলিতে বাছাই করা এবং সেগুলিতে সেখানে অদলবদলের পরিবর্তে কাঙ্ক্ষিত ক্রমে আইটেমগুলি ফিরিয়ে আনেন। এরকম অনেক দৃশ্য রয়েছে।
মাত্র একটি উদাহরণ দুটি তালিকার মার্জ করা:
IEnumerable<object> EfficientMerge(List<object> list1, List<object> list2) {
foreach(var o in list1)
yield return o;
foreach(var o in list2)
yield return o;
}
এই পদ্ধতিটি আইটেমগুলির একটি সংলগ্ন তালিকা ফিরিয়ে দেয়, কার্যকরভাবে কোনও মধ্যবর্তী সংগ্রহের প্রয়োজন নেই a
অধিক তথ্য
yield
শব্দ শুধুমাত্র একটি পুনরুক্তিকারীর পদ্ধতি প্রেক্ষাপটে ব্যবহার করা যাবে (একটি রিটার্ন টাইপ থাকার IEnumerable
, IEnumerator
, IEnumerable<T>
, অথবা IEnumerator<T>
।) এবং সেখানে সঙ্গে এক বিশেষ সম্পর্ক রয়েছে foreach
। Iteilers বিশেষ পদ্ধতি। দুটিই MSDN ফলন ডকুমেন্টেশন এবং পুনরুক্তিকারীর ডকুমেন্টেশন মজার তথ্য এবং ধারণা ব্যাখ্যা প্রচুর রয়েছে। সঙ্গে এটি সম্পর্কিত করতে ভুলবেন না শব্দ এটা সম্পর্কে খুব পড়া, iterators আপনার বোঝার সম্পূরক দ্বারা।foreach
পুনরুক্তিকারীরা কীভাবে তাদের দক্ষতা অর্জন করে সে সম্পর্কে জানতে, গোপনীয়তা সি # সংকলক দ্বারা উত্পাদিত আইএল কোডে রয়েছে। একটি পুনরুক্তি পদ্ধতির জন্য উত্পন্ন আইএল একটি নিয়মিত (নন-ইটারেটর) পদ্ধতির জন্য উত্পন্ন উত্কর্ষের থেকে খুব আলাদা। এই নিবন্ধ (ফলন কীওয়ার্ডটি আসলে কী উত্পন্ন করে?) এই জাতীয় অন্তর্দৃষ্টি সরবরাহ করে।