kraemer
Goto Top

PS: Suche "eleganteren" Code

Moin zusammen,

ich bin auf der Suche nach einem "eleganteren" Code (Powershell).

Es geht um folgendes: in einer Schleife muss eine Variable bei jedem 2. Durchlauf seinen Wert ändern. 3/1/3/1/3....

        [int]$m = 3
        for ($i=326; $i -ge 0; $i--){
...
         if ($m -eq 1){$m=3}
         else {$m=1}
        }

ich finde diesen Part irgendwie unschön
if ($m -eq 1){$m=3}
else {$m=1}

Jemand eine Idee wie man das "schöner" lösen kann?

Gruß

Content-ID: 332731

Url: https://administrator.de/contentid/332731

Ausgedruckt am: 04.12.2024 um 08:12 Uhr

em-pie
em-pie 21.03.2017 um 08:18:46 Uhr
Goto Top
Moin,

du könntest ja ggf. schauen, ob dein $i ohne Rest durch 2 teilbar ist, wenn ja, dann eine 1, ansonsten eine 3 (bzw. umgekehrt)

Das wäre aber nach wie vor eine If-Schleife von nöten...

Mit der Funktion IEEERemainder() kommst du an den Rest dran...

Gruß
em-pie
emeriks
Lösung emeriks 21.03.2017 um 08:29:47 Uhr
Goto Top
Hi,
y = 4 - x
wenn x nur 1 oder 3 sein kann, dann ist y auch immer nur 1 oder 3.

        [int]$m = 3
        for ($i=326; $i -ge 0; $i--){
...
         $m = 4 - $m
        }

E.
MrCount
Lösung MrCount 21.03.2017 um 08:33:02 Uhr
Goto Top
Servus,

ich meine es mal so gesehen zu haben...

@{$true=3;$false=1}[$m -eq 1]
Kraemer
Kraemer 21.03.2017 um 08:37:31 Uhr
Goto Top
Zitat von @MrCount:

Servus,

ich meine es mal so gesehen zu haben...

@{$true=3;$false=1}[$m -eq 1]
Sowas in der Art habe ich gesucht. Gleich mal gucken ob das funktioniert.
132692
Lösung 132692 21.03.2017 aktualisiert um 08:41:04 Uhr
Goto Top
Zitat von @Kraemer:
@{$true=3;$false=1}[$m -eq 1]
Sowas in der Art habe ich gesucht. Gleich mal gucken ob das funktionierte.
Das nutze ich auch immer um sowas abzukürzen.
Ist eine Hashtable die je nach Ergebnis im Indexpart den jeweiligen Wert zurückliefert.
Leider gibt es so was wie in PHP oder c# wie (condition) ? True : False in PS nicht. Ansonsten kleine Function geht natürlich auch.

Gruß p.
Kraemer
Kraemer 21.03.2017 um 08:39:34 Uhr
Goto Top
@em-pie
dein Gedanke hat mich auf die Idee gebracht und das Ganze mit einer Function zu lösen

function IsEven([int]$i){if ($i %2){Return 0}else{Return 1}}
dazu ein Array von $m und gut ist. Wäre aber nur praktikabel wenn das in einem Code häufiger vor kommt.
Wichtig, und daher kommt ja auch meine Frage, ist die Lesbarkeit eines Codes.

Gruß Krämer
Kraemer
Kraemer 21.03.2017 aktualisiert um 08:45:52 Uhr
Goto Top
Zitat von @emeriks:

Hi,
y = 4 - x
wenn x nur 1 oder 3 sein kann, dann ist y auch immer nur 1 oder 3.

>         [int]$m = 3
>         for ($i=326; $i -ge 0; $i--){
> ...
>          $m = 4 - $m
>         }
> 

E.
Deine Idee ist sau cool! Funktioniert perfekt und kürzer geht es in diesem konkreten Fall wohl auch nicht. Leider "liest" sich der Code nicht sonderlich gut - man erkennt auf dem ersten Blick nicht was erreicht werden soll.

Trotzdem vielen Dank!

Gruß
emeriks
emeriks 21.03.2017 um 08:58:19 Uhr
Goto Top
Bisschen Mathe schadet nie. Alter "Trick". Der stammt noch aus Zeiten, als ich die Bytes einzeln programmiert habe ... Kleiner Kommentar dahinter und gut ist. (z.B. "1-->3-->1-->3...")
Kraemer
Kraemer 21.03.2017 um 09:01:18 Uhr
Goto Top
Zitat von @emeriks:

Bisschen Mathe schadet nie. Alter "Trick". Der stammt noch aus Zeiten, als ich die Bytes einzeln programmiert habe ... Kleiner Kommentar dahinter und gut ist. (z.B. "1-->3-->1-->3...")
Da ist was dran. An sich ist deine Lösung nämlich genau so simpel, wie eine einfache Vorzeichenumkehr: x*-1
Clijsters
Clijsters 21.03.2017 um 09:38:21 Uhr
Goto Top
An dieser Stelle sollte aber dennoch erwaehnt sein, dass die Suche nach einem ternaeren Operator in PowerShell ein im Netz intensivst ausdiskutiertes Thema ist. Siehe hier: Ternary operator in PowerShell. An dieser Stelle werden zwar einige interesseante (und elegante) Moeglichkeiten aufgezeigt, die IMHO schoenste und fuer alle am leichtesten leserliche Variante ist und bleibt dann aber doch ein normales if/then-statement.

Am besten gefaellt mir hierzu die Aussage von "fbehrens":
Everything else is incidental complexity and thus to be avoided.

Ich sehe aber ein, dass es in Fragen zu Eleganz und Leserlichkeit selten ein definitives Richtig oder Falsch gibt.

Beste Gruesse

Dominique