String in Bedingung umwandeln - elegante Lösung gesucht

Gast #2597624
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.
Persönliche Seite #2597634
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
}
#2598463
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.
Gast #2598546
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
}
Persönliche Seite #2598735
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.
#2599003
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)
Gast #2599819
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.
Persönliche Seite #2599940
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...
#2599993
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
Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.