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.
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 | }
|
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.
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.
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 | } |
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.
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)
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.
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 :-)
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...
>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
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.
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")