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-Key: 332731

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

Printed on: April 25, 2024 at 07:04 o'clock

Member: em-pie
em-pie Mar 21, 2017 at 07:18:46 (UTC)
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
Member: emeriks
Solution emeriks Mar 21, 2017 at 07:29:47 (UTC)
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.
Member: MrCount
Solution MrCount Mar 21, 2017 at 07:33:02 (UTC)
Goto Top
Servus,

ich meine es mal so gesehen zu haben...

@{$true=3;$false=1}[$m -eq 1]
Member: Kraemer
Kraemer Mar 21, 2017 at 07:37:31 (UTC)
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.
Mitglied: 132692
Solution 132692 Mar 21, 2017 updated at 07:41:04 (UTC)
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.
Member: Kraemer
Kraemer Mar 21, 2017 at 07:39:34 (UTC)
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
Member: Kraemer
Kraemer Mar 21, 2017 updated at 07:45:52 (UTC)
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ß
Member: emeriks
emeriks Mar 21, 2017 at 07:58:19 (UTC)
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...")
Member: Kraemer
Kraemer Mar 21, 2017 at 08:01:18 (UTC)
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
Member: Clijsters
Clijsters Mar 21, 2017 at 08:38:21 (UTC)
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