IEnumerable'ı destekleyen bir koleksiyonda nasıl döngü yapılır?


Yanıtlar:


159

Her biri için bir normal:

foreach (var item in collection)
{
    // do your stuff   
}

Bu, .ElementAt () öğesinden daha hızlıdır. Ne yazık ki, oyum Alexa'nın cevabına bağlı, bu yüzden geri alamam ama en iyi cevap bu. +1
Leo Gurdian

Öyleyse "Olası çoklu numaralandırma IEnumerable" ı nasıl düzeltirsiniz?
SharpC

1
@SharpC: en kolay yol, sonucu bir List <T> veya bir diziye çekmek ve ardından bunu yinelemesi gereken çeşitli yerlere iletmektir. Bu, sonucun (potansiyel olarak pahalı) numaralandırılmasının yalnızca bir kez gerçekleşmesini garanti eder, ancak sonucu bellekte saklama pahasına olur. İlk adımım, çoklu numaralandırmanın aslında bir sorun olup olmadığını bulmak olacaktır.
Fredrik Mörk

94

Halihazırda önerilen foreachdöngü kullanma yöntemlerinin yanı sıra , uygulayan herhangi bir nesnenin IEnumerablede yöntem IEnumeratoraracılığıyla bir arayüz sağladığından bahsetmeyi düşündüm GetEnumerator. Bu yöntem genellikle gerekli olmasa da, koleksiyonları el ile yinelemek için kullanılabilir ve özellikle koleksiyonlar için kendi uzantı yöntemlerinizi yazarken yararlıdır.

IEnumerable<T> mySequence;
using (var sequenceEnum = mySequence.GetEnumerator())
{
    while (sequenceEnum.MoveNext())
    {
        // Do something with sequenceEnum.Current.
    }
}

En iyi örnek, aynı anda iki sekans üzerinde yineleme yapmak istediğiniz zamandır , bu bir foreachdöngü ile mümkün değildir .


7
Numaralandırıcıyı elden çıkarmayı unutmayın.
Eric Lippert

@Eric: Evet, onu ekleyeceğim çünkü kaçırması kolay.
Noldorin

1
Bunun sadece IEnumerable <T> nesneleri için çalışacağını ve IEnumerable için çalışmayacağını düşünüyorum. IEnumerable'a çevirmem gereken genel bir durumum vardı ve bu nedenle GetEnumerator yöntemine sahip değildim. Zaten çoğu durum için güzel.
Fabio Milheiro

51

hatta çok klasik bir eski moda yöntemi

IEnumerable<string> collection = new List<string>() { "a", "b", "c" };

for(int i = 0; i < collection.Count(); i++) 
{
    string str1 = collection.ElementAt(i);
    // do your stuff   
}

belki bu yöntemi de istersiniz :-)


9
Bunun neden bu kadar çok olumlu oyu var? Bu, numaralandırılabilir bir kez yerine 2n kez numaralandırır.
Roma Reiner

1
@RomanReiner, çünkü bu işe yarıyor, bazı insanlar performansla
ilgilenmiyor

@RomanReiner bu iyi bir örnek, bir Koleksiyonun her bir öğesini başka bir koleksiyona
atamam

1
ElementAt uygulamasına bakarsanız, eğer koleksiyon bir IList ise, [] kullanarak dizindeki öğeyi döndürdüklerini göreceksiniz; ancak [] ile aynı performans; yoksa, Numaralandırıcıyı alacaklar ve öğeyi döndürmeden önce sırayla arayan bir yineleme başlatacaklar, bu nedenle temelde her öğe için yeni bir numaralandırıcı oluşturacak ve listede yeniden gezinecekler ...
Israel Garcia,

1
Hepsinden daha kötüsü, IEnumerable, Count () veya ElementAt () 'ı desteklemiyor. Sanırım bir IList düşünüyor. Bu aslında soruya hiç cevap vermiyor.
krowe


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.