verim
yield
Anahtar kelime etkin bir çok daha verimli olabilir toplama öğeleri üzerinde tembel numaralandırma oluşturur. Örneğin, foreach
döngünüz 1 milyon öğeden sadece ilk 5 öğesinde yineleniyorsa yield
, hepsi geri döner ve ilk önce 1 milyon ürün koleksiyonu oluşturmadınız. Aynı şekilde , aynı verimliliği elde etmek için kendi programlama senaryolarınızda dönüş değerleri yield
ile kullanmak isteyeceksiniz IEnumerable<T>
.
Belirli bir senaryoda kazanılmış verimlilik örneği
Bir yineleyici yöntem değil, büyük bir koleksiyonun potansiyel verimsiz kullanımı,
(Orta düzey toplama çok sayıda öğeye sahip olarak oluşturulmuştur)
// 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.
Yineleyici versiyonu, verimli
(Hiçbir ara toplama yapılmamıştır)
// 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.
Bazı programlama senaryolarını basitleştirin
Başka bir durumda, bazı sıralama türlerini ve listelerin birleştirilmesini programlamayı kolaylaştırır, çünkü yield
onları bir ara koleksiyona ayırıp yerine takas etmek yerine sadece istediğiniz sıraya geri yerleştirirsiniz. Böyle birçok senaryo var.
Sadece bir örnek iki listenin birleştirilmesidir:
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;
}
Bu yöntem, bir bitişik öğe listesini geri verir, etkili bir şekilde ara toplama gerektirmeden birleştirme sağlar.
Daha fazla bilgi
yield
Anahtar, sadece (bir dönüş türüne sahip bir yineleyici yöntem bağlamında kullanılabilir IEnumerable
, IEnumerator
, IEnumerable<T>
ya da IEnumerator<T>
.) İle özel bir ilişki vardır foreach
. Yineleyiciler özel yöntemlerdir. MSDN verim dokümantasyon ve yineleyici dokümantasyon ilginç bilgiler ve kavramların açıklanması bolca içerir. İle ilişkilendirmek için emin olun anahtar kelimenin Yineleyicilerin anlayışınızı tamamlamak için de bu konuda okuyarak.foreach
Yineleyicilerin verimliliklerini nasıl elde ettiklerini öğrenmek için sır, C # derleyicisi tarafından oluşturulan IL kodundadır. Bir yineleyici yöntem için oluşturulan IL, normal (yineleyici olmayan) bir yöntem için oluşturulandan büyük ölçüde farklıdır. Bu makale (Verim Gerçekten Anahtar Kelime Üretir mi?) Bu türden bir içgörü sağlar.