Forum: PC-Programmierung String in Bedingung umwandeln - elegante Lösung gesucht


von Severin Scholl (Gast)


Lesenswert?

Hallo.

 Ich habe einen String, etwa

RHX_G_300+RHY_K_200


 Das bedeutet folgendes:

 Ort der rechten Hand in X-Richtung ist größer als 300, Ort der rechten 
Hand in Y-Richtung ist kleiner als 200.

 RHX, der tatsächliche Wert der rechten Hand in X-Richtung entspricht 
dem Wert eines Arrays a an Position 1
 RHY, der tatsächliche Wert der rechten Hand in Y-Richtung entspricht 
dem Wert eines Arrays a an Position 2

 a ist ein double-array.

 Ich möchte etwa den String RHX_G_300+RHY_K_200 umwandeln in
C#-Code:
if (a[1] > 300 && a[2] < 200)
 {
//Dinge tun
 }


 Es gibt noch mehr als RHX und RHY und es gibt noch mehr Elemente, durch 
"+" verbunden, also im if-bereich durch && verknüpft. Das heißt, es kann 
"RHX_G_300+RHY_G_400+RHZ_K_200+..." geben.
 Allerdings gibt es jeweils nur ein RHX oder RHY oder anderes, also etwa 
"RHX_G_300+RHX_G_400" kommt nicht vor.

 Wie mache ich das elegant?

 Ein Codeabschnitt hilft mir weiter.

: Wiederhergestellt durch User
von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Ich würde es Stückweise machen:
1
public boolean isValid(String s) {
2
  String[] parts = myString.split("+");
3
  foreach(String part: parts) {
4
    boolean partValid = evaluate(part);
5
    if (!partValid) {
6
      return false;
7
    }
8
  }
9
  return true;
10
}
In evaluate dann z.B.
1
public boolean evaluate(String s) {
2
 if(s.startsWith("RHY_K_") {
3
 ...
4
 } else if (...) {
5
6
 }
7
 return false;
8
}
Aufruf dann mit
1
if (isValid("RHX_G_300+RHY_K_200") {
2
 //Do something usefull
3
}

: Wiederhergestellt durch User
von Severin Scholl (Gast)


Lesenswert?

Das war hilfreich, vielen Dank.

: Wiederhergestellt durch User
von Dude (Gast)


Lesenswert?

ne, das war gar nicht hilfreich, sowas machen nur doofe java 
Programmierer bei einer versicherung. (=arbeitslos ab 40)

man macht sowas mit regulären ausdrücken oder mit einem kleinen parser, 
je nach dem was neben deiner RH rechten hand noch kommen kann...

lese dich ein, ist nicht so schwer wie es auf den ersten blick scheint.

: Wiederhergestellt durch User
von Klaus W. (mfgkw)


Lesenswert?

Dude schrieb:
> man macht sowas mit regulären ausdrücken oder mit einem kleinen parser,
> je nach dem was neben deiner RH rechten hand noch kommen kann...

Wer ist "man"?

Jemand, der mit seiner Arbeit vorwärts kommen will und noch mehr vorhat 
im Leben?
Oder jemand, der soviel Zeit hat, daß er für jeden Popelkram einen 
Parser schreibt?
Letzterer wird irgendwann wegrationalisiert, weil er zu unproduktiv ist.

: Wiederhergestellt durch User
von Severin Scholl (Gast)


Lesenswert?

Wer das gleiche Problem hat, seine Funktion funktioniert so nicht in c#, 
u.a. weil es nicht boolean sondern bool heißt.

Hier eine aktualisierte Version.
1
public bool isValid(String s)
2
{
3
    String[] parts = s.Split('+');
4
    foreach (String part in parts)
5
    {
6
        bool partValid = evaluate(part);
7
        if (!partValid)
8
        {
9
            return false;
10
        }
11
    }
12
    return true;
13
}
14
15
public bool evaluate(String s) 
16
{
17
    String[] teile = s.Split('_');
18
    if (teile[1] == "G")
19
    {
20
        if (a[string2int(teile[0])] > Int32.Parse(teile[2]))
21
        {
22
            return true;
23
        }
24
    }
25
    else if (teile[1] == "K")
26
    {
27
        if (a[string2int(teile[0])] < Int32.Parse(teile[2]))
28
        {
29
            return true;
30
        }
31
    }
32
  return false;
33
}

: Wiederhergestellt durch User
von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Severin Scholl schrieb:
> Wer das gleiche Problem hat, seine Funktion funktioniert
> so nicht in c#
"Meine" Funktion war auch eher als Anhaltspunkt für eine eigene Lösung 
gedacht. Bei deiner Lösung würde ich noch ein paar Fehlerbehandlungen 
einbauen, u.A. wird das bei einem leeren oder nicht korrekt Formatiertem 
String krachen. Ob man da einfach false zurückgibt oder eine Exception 
wirft hängt vom rest des Programms ab, eine Fehlerausgabe kann aber in 
jedem Fall nicht schaden.

: Wiederhergestellt durch User
von Arc N. (arc)


Lesenswert?

Wenn das Auswerten schneller gehen soll/muss, kann man u.a. mit 
Expression Trees arbeiten
http://msdn.microsoft.com/library/bb397951.aspx
oder direkt IL-Befehle erzeugen
http://msdn.microsoft.com/en-us/library/xcbx21sk.aspx
oder mit dem CSharpCodeProvider arbeiten
http://msdn.microsoft.com/en-us/library/microsoft.csharp.csharpcodeprovider(v=vs.100).aspx
http://msdn.microsoft.com/en-us/library/650ax5cx.aspx
(letzteres liefe dann nach dem Motto Bedingungen in C# umwandeln, 
übersetzen und die erzeugte Assembly laden/ausführen bzw. zur späteren 
Verwendung speichern)

: Wiederhergestellt durch User
von Severin Scholl (Gast)


Lesenswert?

Arc Net schrieb:
> Wenn das Auswerten schneller gehen soll/muss, kann man u.a. mit
> Expression Trees arbeiten
> http://msdn.microsoft.com/library/bb397951.aspx
> oder direkt IL-Befehle erzeugen
> http://msdn.microsoft.com/en-us/library/xcbx21sk.aspx
> oder mit dem CSharpCodeProvider arbeiten
> http://msdn.microsoft.com/en-us/library/microsoft....
> http://msdn.microsoft.com/en-us/library/650ax5cx.aspx
> (letzteres liefe dann nach dem Motto Bedingungen in C# umwandeln,
> übersetzen und die erzeugte Assembly laden/ausführen bzw. zur späteren
> Verwendung speichern)

Ein Codeabschnitt hilft mir mehr als diese Links. Wie würdest du es 
machen? Zeitkritisch ist es tatsächlich.

: Wiederhergestellt durch User
von Klaus W. (mfgkw)


Lesenswert?

Severin Scholl schrieb:
> Ein Codeabschnitt hilft mir mehr als diese Links.

Die Links würden mehr helfen, wenn du es verstehen wolltest anstatt zu 
konsumieren :-)

: Wiederhergestellt durch User
von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Severin Scholl schrieb:
> Zeitkritisch ist es tatsächlich

Gemessen oder gefühlt? Starte doch erstmal mit einer Lösung die 
Funktioniert und für dich verständlich ist, dann kann man immer noch 
optimieren oder alternativen suchen wenn man merkt es kalppt so nicht, 
aber sich hinstellen und hoffen das jemand die Aufgabe schonmal als 
Beispiel löst wo man nur noch ein paar Werte austauschen muss führt 
sicher nicht langfristig zum Ziel...

: Wiederhergestellt durch User
von Robert L. (lrlr)


Lesenswert?

>Ich habe einen String, etwa

>RHX_G_300+RHY_K_200


das "etwa" ist halt dein problem..

es scheint aber SEHR "fixes format" zu sein


ich würde zuerst den string in teile zerlegen  (beim +)
die entstehenden dann bei "_" trennen
die einzelnen teile dann analysieren


du willst ja keinen CODE generieren ? oder ?




ps.code vorkauen tu ich dir sicher nicht

: Wiederhergestellt durch User
von Severin Scholl (Gast)


Lesenswert?

Jetzt hörst du mir mal gut zu mein Lieber. Wenn ich nach einem 
Codebeispiel frage und du das nicht geben kannst, dann antwortest du 
nicht und verschwendest meine Zeit nicht.

: Wiederhergestellt durch User
von Robert L. (lrlr)


Lesenswert?

es handelt sich hier um ein Problem, dass ca. 1/2 stufe über "Hello 
World!" ist..

die "Arroganz" der Fragesteller, ist in letzter Zeit ja kaum mehr zum 
aushalten (siehe auch "Threads beenden und starten")

: Wiederhergestellt durch User
Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.