| 

.NET C# Java Javascript Exception

5
Ich habe eine For-schleife:
for(var i = a; i<b; i++){ ... viel Code ... }

Es kann allerdings vorkommen, dass b<a.
Dann müsste die schleife rückwärts laufen, also:
for(var i = a; i>b; i--){ ... viel Code ... }

Das ist zwar eigentlich nur eine simlpe Änderung doch mir fällt im Moment nichts anderes ein
als beides komplett auszuschreiben, also:
if(a<b){
for(var i = a; i>b; i--){ ... viel Code ... }
} else{
for(var i = a; i<b; i++){ ... viel Code ... }
}

Das würde leider zu sehr viel Redundanz führen, was ich gerne vermeiden möchte.
Eine möglichkeit wäre den Code in den For-schleifen in eine funktion auszulagern die i überliefert bekommt. Die Lösung gefällt mir allerdings nicht.
Vor Allem mit den später im Programm genutzen verschachtelten For-schleifen würde sich der Code vervielfachen.
News:
04.02.2011
Pascal 125 6
Ich glaube es wäre besser wenn du dein Problem, oder dein Ziel genauer beschreiben könntest, denn ich wette, dass es da eine elegantere Lösung gibt als eine dynamische Schleife. Die sind nicht ohne Grund sehr hässlich ;-)
bigbasti 20.02.2012
4 Antworten
2
Ich habe das neulich erst gemacht:

bool isReverse = ...;
int inc = isReverse ? -1 : 1;
for(var i = isReverse ? a : 0; isReverse ? i>b : i<b; i += inc){ ... viel Code ... }

Der Code ist von abscheulicher Hässlichkeit ;-) Alternativ:

Action<int> body = i => { ... viel Code ... }
if(a<b){
for(var i = a; i>b; i--) body (i);
} else{
for(var i = a; i<b; i++) body (i);
}

Das 2te Beispiel könnte in eine Hilfsmethode ausgelagert werden mit body als Parameter.
04.02.2011
alexander 860 2 9
12
for (var i = a; i<b?i<b:i>b; i=i<b?++i:--i)
{
// viel Code
}


Aber schön ist das nicht. Ehrlich gesagt, verstehe ich Dein Problem nicht ganz.
05.02.2011
Joachim 3,1k 4 9
1
Wenn man an C++ Iteratoren denkt, kann man die Berechnungen vor die Schleife ziehen:
function biDir() {
var ps = [
[-11, -11], [-11, -9], [-9, -11], [-2, 2], [0, 0]
, [1, 3], [3, 1], [9, 8], [8, 8], [8, 9]
];
for (var p = 0; p < ps.length; ++p) {
var a = ps[p][0];
var b = ps[p][1];
var step = 1;
if (a > b) {
step = -1;
}
WScript.Stdout.Write(a + " .. " + b + ":");
b += step;
for(var i = a; i != b; i += step) {
WScript.Stdout.Write( " " + i );
}
WScript.Stdout.WriteLine();
}
}
biDir();
-------- Ausgabe ----------
cscript forum.js
-11 .. -11: -11
-11 .. -9: -11 -10 -9
-9 .. -11: -9 -10 -11
-2 .. 2: -2 -1 0 1 2
0 .. 0: 0
1 .. 3: 1 2 3
3 .. 1: 3 2 1
9 .. 8: 9 8
8 .. 8: 8
8 .. 9: 8 9
05.02.2011
Ekkehard.Horner 147 1
Es mit != zu machen ist natürlich auch ne schlaue Idee. Da spart man sich das umdrehen des >
Pascal 05.02.2011
0
Ah super danke. Das erste ist genau das was ich gesucht hab. Sieht zwar schlimm aus aber es triffts und ist kompakt. Dass ich da nicht drauf gekommen bin diese tollen Arithmetischen ifs zu verwenden. Da ich gerade Schach programmiere das eig nur aus einem integer Array besteht sieht der Code eh etwas verwirrend aus. Da macht das auch nicht mehr viel ;-)
04.02.2011
Pascal 125 6
Ich habe übersehen, dass es um flash geht. Glaube, ihr habt keine delegates/Funktionszeiger/Closures, so dass das 2te Beispiel eh nicht geht.
alexander 04.02.2011
Btw, denk dran die richtige Antwort zu akzeptieren ;-)
alexander 05.02.2011
aber Funktionen müsste Flash können.
Floyd 05.02.2011
Um Rückfragen zu stellen, bitte die "Antworten" Funktion benutzen.
Mario Priebe 05.02.2011
2
"Kommentieren" Funktion : )
Mario Priebe 05.02.2011

Stelle deine Flash-Frage jetzt!