Entwickler-Ecke

C# - Die Sprache - Komplizierteres Problem mit for-Schleife


wubudu - Mi 18.06.08 17:28
Titel: Komplizierteres Problem mit for-Schleife
Hallo Leute,

ich hab ein kleines Problem mit einigen Schleifen. Hier ist der Code:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
string strSuche2 = "STATUS FAILED";
            for (int i = 0; i < textBox1Log.Lines.Length; i++)
            {
                foreach (string str in textBox1Log.Lines)
                {
                    if (str.Contains(strSuche2))
                    {
                        textBox1.AppendText(string.Format("STATUS FALIED\r\n"));
                        timer1.Stop();
                        //button2_Click_1(null, null);
                        return;
                    }
                 }
            }

Ich möchte einfach herausfinden ob in der textBoxLog das Wort STATUS FAILED vorhanden ist. Wenn das gewünschte Wort in der textBoxLog vorhanden ist, soll in der textBox1 auch STATUS FAILED stehen. Falls in der textBoxLog das Wort nicht vorhanden ist, soll einfach OK in die textBox1 übertragen werden. Nur das Problem ist folgendes: Wenn ich z.B. eine zweite if-Schleife setze, also so:

C#-Quelltext
1:
2:
3:
4:
if (!(str.Contains(strSuche2)))
{
     textBox1.AppendText(string.Format("STATUS FALIED\r\n"));
}

wird das OK mehrmals angezeigt, was ich aber nicht will. Ich will erst das OK auf die textBox1 übertragen, wenn wirklich das STATUS FAILED nicht vorhanden ist. Nur irgendwie funktioniert das nicht. Ich verwende nebenbei noch einen Timer, damit er regelmäßig prüft.

Ich hoffe mal, dass ihr das Problem versteht. Ich hab den Thread hier in dem Topic gepostet, hoffe das ich hier richtig bin ;).

wubudu :!:


JüTho - Mi 18.06.08 17:36

Was ist eine if-Schleife [http://www.if-schleife.de]?

Erst am Schluss nach der ganzen Schleife wird "OK" hinzugefügt. Dorthin kommst Du nur dann, wenn Du nicht mir return vorher aus der ganzen Methode geflogen bist.

Ich halte es übrigens für besser, wenn eine Methode nicht mittendrin (auch noch in einer Schleife) mit return abgebrochen wird. (Das ist hier allerdings kein Problem.) Besser sind meistens unterschiedliche Abfragen innerhalb der Methode und ein einheitliches return; die Schleife müsste natürlich mit break abgebrochen werden.

Jürgen


Chryzler - Mi 18.06.08 18:08

@user profile iconwubudu: Ist die for-Schleife in deinem Beispiel nicht irgendwie überflüssig? Du kannst übrigens auch folgendes machen:

C#-Quelltext
1:
2:
3:
4:
if (textBoxLog.Lines.Any(s => s.Contains("STATUS FAILED")))
    textBox1.Lines.Add("STATUS FAILED");
else
    textBox1.Lines.Add("OK");

Oder ganz kurz: :)

C#-Quelltext
1:
textBox1.Lines.Add(textBoxLog.Lines.Any(s => s.Contains("STATUS FAILED")) ? "STATUS FAILED" : "OK");                    


EDIT: Hmm, warum eigentlich nicht einfach textBox1.Text.Contains("STATUS FAILED")?


wubudu - Mi 18.06.08 20:49

Hallo Chryzler,

ich hab deinen Code übernommen, jedoch erhalte ich vom Compiler folgende Fehlermeldung:
Zitat:
"System.Array" enthält keine Definition für "Add", und es konnte keine Erweiterungsmethode "Add" gefunden werden, die ein erstes Argument vom Typ "System.Array" akzeptiert. (Fehlt eine Using-Direktive oder ein Assemblyverweis?)


user profile iconChryzler hat folgendes geschrieben:
EDIT: Hmm, warum eigentlich nicht einfach textBox1.Text.Contains("STATUS FAILED")?

Das Problem hab ich im ersten Post beschreiben ;)

wubudu :!:


Christian S. - Mi 18.06.08 20:52

user profile iconwubudu hat folgendes geschrieben:
user profile iconChryzler hat folgendes geschrieben:
EDIT: Hmm, warum eigentlich nicht einfach textBox1.Text.Contains("STATUS FAILED")?

Das Problem hab ich im ersten Post beschreiben ;)
Nope. Chryzler postete einen Code, der das Contains auf den gesamten Text bezieht, Du gehst im ersten Posting auf das Contains ein, welches für jede Zeile aufgerufen wird. Ein Contains auf den gesamten Text scheint mir irgendwie auch die beste Möglichkeit :nixweiss:


Chryzler - Mi 18.06.08 20:57

user profile iconwubudu hat folgendes geschrieben:
Hallo Chryzler,

ich hab deinen Code übernommen, jedoch erhalte ich vom Compiler folgende Fehlermeldung:
Zitat:
"System.Array" enthält keine Definition für "Add", und es konnte keine Erweiterungsmethode "Add" gefunden werden, die ein erstes Argument vom Typ "System.Array" akzeptiert. (Fehlt eine Using-Direktive oder ein Assemblyverweis?)

Ach das ist falsch von mir, das muss textBox1.AppendText("STATUS FAILED\r\n"); heißen.
user profile iconChristian S. hat folgendes geschrieben:
Nope. Chryzler postete einen Code, der das Contains auf den gesamten Text bezieht, Du gehst im ersten Posting auf das Contains ein, welches für jede Zeile aufgerufen wird. Ein Contains auf den gesamten Text scheint mir irgendwie auch die beste Möglichkeit :nixweiss:

Jep.