2017-10-16 4 views
2

MitOperatoren: "Bool ++" in C#

public void Main() 
{ 
    int i = 0; 
    Console.WriteLine($"I was {i++}, now I is {i}"); 
    bool b = true; 
    Console.WriteLine($"B was {b}, now B is {b}"); 
} 
//I was 0, now I is 1 
//B was True, now B is True 

Gibt es eine Möglichkeit, den B Wert "inline" zu ändern?

Praktische Notwendigkeit: In Inline-Razor

bool isActive = true; 
@foreach(var item in list) { 
    <li class="@(isActive-- ? "active": "")">... 
} 

<li class="active">... 
<li class="">... 
<li class="">... 
<li class="">... 
<li class="">... 

Abhilfe für das praktische Beispiel zur Herstellung von mit integers:

int isActive = 1; 
@foreach(var item in list) { 
    <li class="@(isActive-- > 0 ? "active": "")">... 
} 
+0

Sie meinen wie Negation Operator oder?Sie können immer 'if (b = DoSomething()))' –

+0

eher wie Negation Operator – Serge

+0

Was meinst du mit "ändern" inline? – Amy

Antwort

-1

Sie in der Lage sein sollten, das @ zu verwenden () Ausdruckssyntax:

<li class="@(isActive ? "active" : " ")">My link here</li> 
+0

ich brauche nur die erste aktive klasse, nicht die anderen – Serge

+0

können sie leer sonst part.It funktioniert – lazydeveloper

+0

ich brauche isActive nur einmal von wahr zu falsch ändern. – Serge

1

Sie können den Zuweisungsoperator inline anwenden. Es gibt Bezugswert:

// b = !b both assigns false to b and returns assigned value 
Console.WriteLine($"B was {b}, now B is {b = !b}"); 
// B was True, now B is False 

Für Ihr Beispiel Rasierer Ansicht können Sie (ab) verwenden Sie es wie folgt aus:

bool active = true; 
Console.WriteLine($"B is {(active ? (active = false) ? "" :"active" : "")}"); 
Console.WriteLine($"B is {(active ? (active = false) ? "" : "active" : "")}"); 
Console.WriteLine($"B is {(active ? (active = false) ? "" : "active" : "")}"); 
// outputs B is active 
// B is 
// B is 

Nicht, dass ich dies empfehlen, aber wie Sie gesagt haben, es ist nur eine Frage zur Sprache.

+0

Wie funktioniert es in meinem Razor Sample? @ (isActive? changeIt) – Serge

+0

Ich fand eine Lösung (in aktualisierten OP) mit Ganzzahlen ... aber mit Bools ist komplizierter :) – Serge

0

inlining im Sinne der Änderung einer Variablen in der if-conditition ist möglich.

var b = false; 
if((b = !b) == true) { 
    Console.WriteLine("Hi"); 
} 

Dies kompiliert ein Testament drucken Hi.

Das gleiche gilt für Ihre Rasierer-Anweisung oder während eines Zeichenfolge Formatierung:

Console.WriteLine($"b was {b}, now b is {b = !b}"); 
// b was true, now b is false 

In Bezug auf Ihrem Beispiel ist dies nicht möglich, mit einer ternary if Aussage.

Wir können eine Anweisung verwenden, um die Variable auf false und nicht Druck aktiv einzustellen.

b ? (b = false) : ""; 

Wir können dann nisten andere if Anweisung die aktiv zu drucken. Weil b bereits false ist, müssen wir b negieren. Die leere Zeichenfolge im Pfad else wird niemals erreicht, ist aber erforderlich, um den Compiler zu erfüllen.

!(b = false) ? "active" : "never reached" 

Nach jener Kombination erhalten wir:

b ? (!(b = false) ? "active" : "") : ""; 

Diese nur active für das erste Element emittiert wird.

var b = true; 
Console.WriteLine(b ? (!(b = false) ? "active" : "") : ""); // prints "active" 
Console.WriteLine(b ? (!(b = false) ? "active" : "") : ""); // prints "" 
Console.WriteLine(b ? (!(b = false) ? "active" : "") : ""); // prints "" 
+0

danke, bitte schlagen Sie eine Lösung für Razor in der aktualisierten OP Beispiel – Serge

+0

@Serge tut diese Hilfe? – Iqon

+0

hatte ich auch diese Idee, endlich aufgegeben, weil unlesbar war ... stell, dass im Code nur ich verstehen werde, was es heißt ... das @evk-Beispiel besser lesbar ... bis ich schließlich die Integer-Lösung benutzt habe .. Ich habe keine gute Lösung für mein Ding gefunden ... – Serge