Bagaimana cara melakukan perulangan melalui koleksi yang mendukung IEnumerable?

90

Bagaimana cara melakukan perulangan melalui koleksi yang mendukung IEnumerable?

mrblah
sumber

Jawaban:

155

Biasa untuk masing-masing akan melakukan:

foreach (var item in collection)
{
    // do your stuff   
}
Fredrik Mörk
sumber
Ini lebih cepat dari .ElementAt (). Sayangnya, suara saya terkunci pada jawaban Alexa jadi saya tidak dapat membatalkannya tetapi ini adalah jawaban terbaik. +1
Leo Gurdian
Jadi bagaimana Anda kemudian memperbaiki "Kemungkinan beberapa enumerasi IEnumerable"?
SharpC
1
@SharpC: cara termudah adalah dengan menarik hasil ke dalam List <T> atau array, dan kemudian meneruskannya ke berbagai tempat yang perlu mengulanginya. Ini menjamin bahwa pencacahan (yang berpotensi mahal) hasil hanya terjadi sekali, tetapi dengan biaya penyimpanan hasil dalam memori. Langkah pertama saya adalah mencari tahu apakah pencacahan ganda benar-benar menjadi masalah atau tidak.
Fredrik Mörk
94

Seiring dengan metode yang sudah disarankan untuk menggunakan foreachloop, saya pikir saya juga akan menyebutkan bahwa objek apa pun yang diimplementasikan IEnumerablejuga menyediakan IEnumeratorantarmuka melalui GetEnumeratormetode tersebut. Meskipun metode ini biasanya tidak diperlukan, metode ini dapat digunakan untuk mengulang koleksi secara manual, dan sangat berguna saat menulis metode ekstensi Anda sendiri untuk koleksi.

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

Contoh utama adalah ketika Anda ingin mengulang dua urutan secara bersamaan , yang tidak mungkin dilakukan dengan satu foreachputaran.

Noldorin
sumber
7
Jangan lupa buang pencacah.
Eric Lippert
@Eric: Ya, saya akan menambahkannya karena mudah untuk dilewatkan.
Noldorin
1
Saya pikir itu hanya akan bekerja untuk objek IEnumerable <T> dan bukan untuk IEnumerable. Saya memiliki kasus umum di mana saya harus melakukan cast ke IEnumerable dan, oleh karena itu, saya tidak memiliki metode GetEnumerator yang tersedia. Bagus untuk kebanyakan kasus.
Fabio Milheiro
50

atau bahkan metode mode lama yang sangat klasik

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   
}

mungkin Anda juga akan menyukai metode ini :-)

Alexa Adrian
sumber
9
Mengapa ini memiliki begitu banyak suara positif? Ini akan menghitung 2n kali, bukan sekali.
Roman Reiner
1
@RomanReiner karena ini berfungsi, beberapa orang tidak peduli dengan kinerjanya :)
Khateeb321
@RomanReiner ini adalah contoh yang bagus, saya perlu menetapkan setiap elemen dari satu Koleksi ke koleksi lain, saya rasa saya tidak bisa melakukan ini menggunakan foreach
AminM
1
Jika Anda melihat implementasi ElementAt, Anda akan mengetahui bahwa jika collection adalah IList, mereka mengembalikan elemen pada indeks menggunakan []; kinerja yang sama seperti [], namun; jika tidak, mereka akan mendapatkan Pencacah dan memulai iterasi secara berurutan mencari elemen sebelum mengembalikannya, jadi pada dasarnya untuk setiap elemen mereka membuat pencacah baru dan menavigasi daftar lagi ...
Israel Garcia
1
Lebih buruk dari itu semua, IEnumerable tidak mendukung Count () atau ElementAt (). Saya pikir dia sedang memikirkan seorang IList. Ini sebenarnya tidak menjawab pertanyaan itu sama sekali.
krowe
8
foreach (var element in instanceOfAClassThatImplelemntIEnumerable)
{

}
Darin Dimitrov
sumber
0

Mungkin Anda lupa menunggu sebelum mengembalikan koleksi Anda

Elialber Lopes
sumber