Laden...

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

Erstellt von dN!3L vor 14 Jahren Letzter Beitrag vor 14 Jahren 2.077 Views
dN!3L Themenstarter:in
2.891 Beiträge seit 2004
vor 14 Jahren
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

I
302 Beiträge seit 2008
vor 14 Jahren

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

dN!3L Themenstarter:in
2.891 Beiträge seit 2004
vor 14 Jahren

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

I
302 Beiträge seit 2008
vor 14 Jahren

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

dN!3L Themenstarter:in
2.891 Beiträge seit 2004
vor 14 Jahren

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

I
302 Beiträge seit 2008
vor 14 Jahren

ja null weil i==max

946 Beiträge seit 2008
vor 14 Jahren

@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

I
302 Beiträge seit 2008
vor 14 Jahren

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

946 Beiträge seit 2008
vor 14 Jahren

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

I
302 Beiträge seit 2008
vor 14 Jahren

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)

dN!3L Themenstarter:in
2.891 Beiträge seit 2004
vor 14 Jahren

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