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
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
Das war hilfreich, vielen Dank.
:
Wiederhergestellt durch User
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
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
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
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
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
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
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
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
>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
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
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