Laden...

Wie kann ich in einer If-Abfrage zum nächsten Item übergehen ohne die If-Abfrage zu verlassen?

Erstellt von Krumnix vor 6 Jahren Letzter Beitrag vor 6 Jahren 2.262 Views
K
Krumnix Themenstarter:in
129 Beiträge seit 2018
vor 6 Jahren
Wie kann ich in einer If-Abfrage zum nächsten Item übergehen ohne die If-Abfrage zu verlassen?

Hallo.

Vielleicht wurde das schon gefragt oder ich stelle mich doof an, hoffe aber auf einen Tipp 😃

Ich habe in einer For-Schleife mehrere IF-Abfragen drin, welche mir einen String auswerten sollen.
Es sollen bis zu 40 Möglichkeiten, welche in dem String drin sein könnten, abgefragt werden und dann jeweils eine Aktion erfolgen.
Oft ist es so, dass 2 oder 3 Möglichkeiten zusammen abgefragt werden, und wenn alle zusammen vorhanden waren, eine weitere Aktion erfolgen soll.

Schnelles Beispiel:


....
FOR I=1;I>=100;I++)
{
  IF A=true
  {
    IF B=true {}
    IF C=true {}
    IF D=true {}
    IF E=true {}
    IF C=true && D=true {}
  }
}

Wenn nun B=true ist, muss der Rest nicht mehr geprüft werden.
Wie kann ich nun zurück zum nächsten FOR-Schritt, ohne die FOR-Schleife zu verlassen?

H
523 Beiträge seit 2008
vor 6 Jahren

Wie kann ich nun zurück zum nächsten FOR-Schritt, ohne die FOR-Schleife zu verlassen?

Generell geht das mit

continue
            for (int i = 0; i < 10; i++)
            {
                if (i == 1)
                {
                    continue;
                }

                Console.WriteLine(i);
            }
K
Krumnix Themenstarter:in
129 Beiträge seit 2018
vor 6 Jahren

Danke.

Das hab ich gesucht, gewusst, aber irgendwie bin ich grad nicht drauf gekommen.

Ich brauch einen Kaffee 😃

3.003 Beiträge seit 2006
vor 6 Jahren

Ich habe in einer For-Schleife mehrere IF-Abfragen drin, welche mir einen String auswerten sollen.
Es sollen bis zu 40 Möglichkeiten, welche in dem String drin sein könnten, abgefragt werden und dann jeweils eine Aktion erfolgen.

Abgesehen von continue sind 40 if-Anweisungen schon ein extrem starker code smell. Solltest du dringend überarbeiten. (Außerdem [Tipp] Anfängerhinweis == true / == false)

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

K
Krumnix Themenstarter:in
129 Beiträge seit 2018
vor 6 Jahren

true/false war nur ein schnelles Beispiel. true verwende ich in IF garnicht.

Aber wegen den 40 IF. Da hab ich keine Idee, wie es anderes funktionieren könnte.

Bekomme halt von einem Mess/Steuergerät über eine Schnittstelle einen String gesendet, welche unterschiedliche Informationen beinhaltet.
Leider sind diese nicht wirklich getrennt.

Beispiel:
InputX12TRUEOutputX14FALSETimeT13#200TimeT14#100
oder
OutputX11TRUECheckConnectionOKParaChangeUserP300#3#4
oder
ParaChangeUserP200#2#9ActivatedFunction700#OK

etc.
Je nachdem was kommt, muss ich dann halt drauf reagieren.
Ich schau halt, ob einer der Befehle im String vorhanden ist und drauf reagieren.

P
1.090 Beiträge seit 2011
vor 6 Jahren

Du kannst eine Schnittstelle machen.

z.b.

ICommand
{

bool IsCommand(String command)

void Execute(String command)

}

Die Implementiert du in deiner Klasse.

Und die Benutzung könnte dann so aus sehen.

myClass{

[ImportMany] //MEF als IOC holt dir alle Klassen die ICommand Implementieren, geht aber auch mit add
IList<ICommand> commands;

void Run(String command)
{
    var commandsToRun = commands.Where(c => c.IsCommand(command);

    for each (com in commandsToRun)
{
     com.Execute(command);
}

}

}

Ist jetzt frei herunter geschrieben

Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern

3.003 Beiträge seit 2006
vor 6 Jahren

Aber wegen den 40 IF. Da hab ich keine Idee, wie es anderes funktionieren könnte.

Weil das ein ziemlich häufig vorkommendes Problem ist, und weil es ein Problem ist, das die Organisation des Codes betrifft (und nicht die Funktion, deine Variante tut ja, sie ist nur sch....lecht zu warten und zu lesen), gibt es dafür erprobte, funktionierende Vorgehensweisen. Eine gut funktionierende (und nicht zu komplexe) hat Palin genannt, an deiner Stelle würde ich mir auch mal Command und Chain of Responsibility anschauen. Selbst, wenn du sie für zu komplex hältst: man wird kein schlechterer Programmierer, wenn man sie kennt 😉.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)