Wie durchlaufe ich eine Sammlung, die IEnumerable unterstützt?


Antworten:


153

Ein Stammgast für jeden reicht aus:

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

Dies ist schneller als .ElementAt (). Leider ist meine Stimme an Alexas Antwort gebunden, so dass ich sie nicht rückgängig machen kann, aber dies ist die beste Antwort. +1
Leo Gurdian

Wie behebt man dann "Mögliche Mehrfachaufzählung von IEnumerable"?
SharpC

1
@SharpC: Der einfachste Weg ist, das Ergebnis in eine Liste <T> oder ein Array zu ziehen und es dann an die verschiedenen Stellen zu übergeben, die darüber iterieren müssen. Dies garantiert, dass die (möglicherweise teure) Aufzählung des Ergebnisses nur einmal erfolgt, jedoch auf Kosten der Speicherung des Ergebnisses im Speicher. Mein erster Schritt wäre herauszufinden, ob die Mehrfachaufzählung tatsächlich ein Problem ist oder nicht.
Fredrik Mörk

93

Neben den bereits vorgeschlagenen Methoden zur Verwendung einer foreachSchleife dachte ich, ich würde auch erwähnen, dass jedes Objekt, das implementiert, IEnumerableauch eine IEnumeratorSchnittstelle über die GetEnumeratorMethode bereitstellt . Obwohl diese Methode normalerweise nicht erforderlich ist, kann sie zum manuellen Durchlaufen von Sammlungen verwendet werden und ist besonders nützlich, wenn Sie eigene Erweiterungsmethoden für Sammlungen schreiben.

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

Ein Paradebeispiel ist, wenn Sie zwei Sequenzen gleichzeitig durchlaufen möchten , was mit einer foreachSchleife nicht möglich ist.


7
Vergessen Sie nicht, den Enumerator zu entsorgen.
Eric Lippert

@ Eric: Ja, ich werde das hinzufügen, weil es leicht zu übersehen ist.
Noldorin

1
Ich denke, das funktioniert nur für IEnumerable <T> -Objekte und nicht für IEnumerable. Ich hatte einen generischen Fall, in dem ich in IEnumerable umwandeln musste, und daher war die GetEnumerator-Methode nicht verfügbar. Für die meisten Fälle sowieso schön.
Fabio Milheiro

50

oder sogar eine sehr klassische altmodische Methode

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   
}

Vielleicht möchten Sie diese Methode auch :-)


9
Warum hat das so viele positive Stimmen? Dadurch werden die Aufzählungen 2n statt einmal aufgelistet.
Roman Reiner

1
@ RomanReiner, weil dies funktioniert, einige Leute kümmern sich nicht um die Leistung :)
Khateeb321

@ RomanReiner dies ist ein gutes Beispiel, ich muss jedes Element einer Sammlung einer anderen Sammlung zuweisen, ich denke, ich kann dies nicht mit foreach tun
AminM

@AminM Wenn Sie einen Index benötigen, hat Linq eine Select-Überladung, die ihn bereitstellt. Oder setzen Sie i = 0 vor foreach und i ++ in den Schleifenkörper. Alles besser als die Verwendung von ElementAt in einer for-Schleife, um eine Aufzählung zu iterieren.
Roman Reiner

1
Es ist schlimmer als das alles, IEnumerable unterstützt Count () oder ElementAt () nicht. Ich denke, er denkt an einen IListen. Dies beantwortet die Frage überhaupt nicht.
Krowe


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.