"for each" Index



  • Hallo,

    mit der "for each" Schleife ist es möglich, ohne viel Aufwand ein array komplett zu durchlaufen und deren Werte zurück zu liefern.

    Beispiel:

    array<int> ^MeinArray = { 100, 200, 300, 400 };
    String^ str;
    for each( int i in MeinArray ) str += i.ToString() + " "
    

    Das Problem war immer, das ich auch gerne den aktuellen Index zurück geliefert haben möchte, ohne eine extra Variable hierfür zu verwenden der immer um eins hoch zählt.
    Zufällig bin ich auf die Variable "$I" gestoßen, die anscheinend standardmäßig als interner Zähler in "for each"-Schleifen verwendet wird.

    Kennt jemand noch diese Variable und gibt es hierfür eine offizielle Beschreibung?

    Grüße
    Stefan



  • Hallo,

    sehr interessant, mit $I kann man auch spielen 🙂

    String ^str = "Hello World";	
    	for each( char c in str)
    	{
    		Console::WriteLine(c);
    		$I++;
    	}
    

    In der MSDN habe ich darüber auch nichts gefunden. Das "Feature" finde ich allerding sehr nützlich.

    Gruß
    foodax



  • Ich hab das auch noch nie gesehen... WO hast Du das her?
    hab mal die Produktgruppe gefragt... die werden aber wohl im Urlaub sein 😉
    Doku konnte ich auch nicht finden...



  • Interessanterweise macht der Compiler aber dann kein IEnumeralble daraus, sondern eine *normale* for-Schleife:

    Hier der erzeugte C#-Code:

    int main()
    {
        int[] $S1 = null;
        $S1 = new int[] { 100, 200, 300, 400 };
        for (int $I = 0; $I < $S1.Length; $I++)
        {
            Console.WriteLine($S1[$I].ToString() + " " + $I);
        }
        return 0;
    }
    

    Lässt man hingegen das "$I" weg, so wird eine "normale" for-each Schleife erzeugt:

    int main()
    {
        foreach (int v in new int[] { 100, 200, 300, 400 })
        {
            Console.WriteLine(v.ToString() + " ");
        }
        return 0;
    }
    


  • Jochen Kalmbach schrieb:

    Ich hab das auch noch nie gesehen... WO hast Du das her?
    hab mal die Produktgruppe gefragt... die werden aber wohl im Urlaub sein 😉
    Doku konnte ich auch nicht finden...

    Du kannst im "Lokal" Debugfenster schauen, da gibts noch mehr.

    Gruß
    foodax



  • Ganz genau foodax, genau von daher habe ich auch diese Variable!
    Ich fragte mich natürlich woher die kommt!
    Ich denke diese Variable ist als interner Hilszähler gedacht.
    Eine Beschreibung von den msdn-Seiten habe ich leider auch keine gefunden!
    Wenn ihr noch irgendwas ofizielles erfährt dann würde mich das intressieren!

    Grüße
    Stefan



  • Es ist ein Nebeneffekt des Compilers:

    Siehe: The mystic variable “$I” during for each
    http://blog.kalmbach-software.de/2009/12/30/the-mystic-variable-i-during-for-each/

    Die Variable ist auch nur bei "arrays" vorhanden, nicht aber bei "echten" foreach loops...



  • Hallo,

    Jochen Kalmbach schrieb:

    Es ist ein Nebeneffekt des Compilers:

    Siehe: The mystic variable “$I” during for each
    http://blog.kalmbach-software.de/2009/12/30/the-mystic-variable-i-during-for-each/

    Die Variable ist auch nur bei "arrays" vorhanden, nicht aber bei "echten" foreach loops...

    Sollte es in der Schlussfolgerung am Ende des Eintrags nicht besser heissen:

    Do not rely on the compiler generated variable “$I”, and do not use “for each” if you need a index-variable, just use a normal for loop.

    ? Oder wolltest du etwas anderes ausdrücken?

    MfG,

    Probe-Nutzer



  • Dake für den Hinweis... da hat es vermutlich noch mehr Fehler drin 😉
    Vor lauter Kinder um mich rum, hab ich nicht so viel Zeit es korrektur zu lesen...