Laden...

Ist foreach angewendet auf IEnumerable intern eine for- oder eine while-Schleife?

Letzter Beitrag vor 15 Jahren 11 Posts 2.102 Views
Ist foreach angewendet auf IEnumerable intern eine for- oder eine while-Schleife?

[EDIT=herbivore]Abgeteilt von foreach-schleife in UML darstellen[EDIT]

Hallo,

letztendlich ist es ja ne for schleife

Nein. Stattdessen wird - wenn du foreach auf ein IEnumerable anwendest - "intern" folgendes gemacht:

IEnumerator<Item> enumerator = enumerable.GetEnumerator();
try
{
	while (enumerator.MoveNext())
	{
		Item item = enumerator.Current;
		...
	}
}
finally
{
	if ((enumerator!=null)
		enumerator.Dispose();
}

EDIT: Durch Hinweis von SeeQuark etwas korrigiert.

Gruß,
dN!3L

könnte man sich nun streiten was ne while schleife macht 😃

könnte man sich nun streiten was ne while schleife macht 😃

???
Es geht darum, dass bei einem IEnumerable eben nicht indexiert (wie in der for-Schleife) auf die Elemente zugegriffen wird (und auch nicht kann!), sondern mit MoveNext() (bis man ans Ende gekommen ist).

Gruß,
dN!3L

woher weißt du denn das du am ende bist?

woher weißt du denn das du am ende bist?

Guck in den Code, dann siehst du es...! MoveNext() gibt null zurück. Von einem IEnumerable weißt du weder, welchen Index dein Element hat, noch wie viel Elemente überhaupt drin sind.

Gruß,
dN!3L

ja null weil i==max

@itstata: Das ist nicht bei allen IEnumarables so. Oder man kann sich nicht immer darauf verlassen.

MoveNext() gibt null zurück

Es gibt false zurück 😉 Siehe IEnumerator.MoveNext-Methode.

mfg
SeeQuark

aber muss nicht irgendwie festgestellt werden ob das ende erreicht ist?

Wie macht es wohl eine LinkedList<>? Die stellt keinen Indexer zur Verfügung.
mfg
SeeQuark

Wenn die LinkedList<(Of <(T>)>) leer ist, enthalten die First-Eigenschaft und die Last-Eigenschaft null....

alles klar, ich denke jetzt hab ichs 😃
LinkedList<T>-Klasse (System.Collections.Generic)

ja null weil i==max

Tja, wie lang ist wohl folgende Aufzählung? 😉

public static IEnumerable<string> Test()
{
	while (true)
		yield return "hahaha";
}

Ernst beiseite: Eben durch z.B. solch yield return-Sachen weiß man erst, wie lang die Auflistung eigentlich ist, wenn man am Ende angekommen ist.

Gruß,
dN!3L