Ergebnis 1 bis 18 von 18
-
Mich gibt's schon länger
- 27.11.2012, 00:02
- #1
Hallo Community, ich versuche gerade eine kleine App zu schreiben die mir die Molmassen einens Moleküls berechnet. Einfach um ein wenig Erfahrung in C# zu gewinnen. Nun stehe ich vor der Problematik dass ich nicht weiter weiß. Z.B bei der Eingabe von NaCl.
Code:[FONT=Consolas][FONT=Consolas][FONT=Consolas]string[/FONT][/FONT][/FONT][FONT=Consolas][FONT=Consolas] str = myTexteingabe.Text;[/FONT][/FONT] [FONT=Consolas][FONT=Consolas] [/FONT][/FONT][FONT=Consolas][FONT=Consolas][/FONT][/FONT][FONT=Consolas][FONT=Consolas][FONT=Consolas]char[/FONT][/FONT][/FONT][FONT=Consolas][FONT=Consolas][] split = { [/FONT][/FONT][FONT=Consolas][FONT=Consolas][FONT=Consolas]' '[/FONT][/FONT][/FONT][FONT=Consolas][FONT=Consolas], [/FONT][/FONT][FONT=Consolas][FONT=Consolas][FONT=Consolas]'+'[/FONT][/FONT][/FONT][FONT=Consolas][FONT=Consolas] };[/FONT][/FONT] [FONT=Consolas][FONT=Consolas] [/FONT][/FONT][FONT=Consolas][FONT=Consolas][/FONT][/FONT][FONT=Consolas][FONT=Consolas][FONT=Consolas]string[/FONT][/FONT][/FONT][FONT=Consolas][FONT=Consolas][] splitted = str.Split(split);[/FONT][/FONT]
-
- 27.11.2012, 06:30
- #2
Hmm, am besten vilelleicht über reguläre Ausdrücke:
Code:Regex r = new Regex("(?:([A-Z][a-z]{0,2}))+"); //suche nach Grossbuchstabe gefolgt von mindestens null, maximal zwei Kleinbuchstaben. Wiederhohle dies so oft es geht, packe jeden Treffer in einen eigenen Match. allMatchResults = r.Matches(subjectString); if (allMatchResults.Count > 0) { //allMatchResults.Item[0]; //ist der erste Treffer. //allMatchResults.Item[1]; //entsprechend der zweite.
-
Gehöre zum Inventar
- 27.11.2012, 09:17
- #3
Also wenn du "NaCl + HCl" mit deinem Code aufsplittest, dann hast du nachher "NaCl " + " HCl" in deinen gesplitteten Strings stehen. Da solltest du auf jeden Fall noch Trim drauf aufrufen, damit die Leerzeichen wegkommen.
Ansonsten sollte das mit der Regex passen - die Dinger sind zwar quasi unlesbar aber unglaublich praktisch. Alternativ könnte man selbst einen Parser schreiben - mehr Aufwand, dafür aber im nachhinein eher wartbar.
-
- 27.11.2012, 11:52
- #4
Nee whitespace wird nicht gematcht
Mit der kostenlosen PocketPC.ch App von meinem LG-E900 aus geschrieben.
-
Mich gibt's schon länger
- 27.11.2012, 15:29
- #5
Danke euch für die schnelle Antwort.
Werde es gleich mal mit Regex ausprobieren. Wie ist es mit dem eigenen Parser gemeint?
Und ich dachte, wenn ich den String NaCl + HCL mit ' ' und '+' trenne hat splitted[0] = "NaCl" und splitted[1] = "HCL". oder sehe ich das jetzt Falsch?
-
Gehöre zum Inventar
- 27.11.2012, 16:48
- #6
Nach dem Trim hast du die Leerzeichen da noch mit drinnen - scheinbar filtert das aber dann die Regex raus so wie sie da oben definiert ist.
-
Mich gibt's schon länger
- 27.11.2012, 23:29
- #7
Code:Regex r = new Regex("(?:([A-Z][a-z]{0,2}))+"); //suche nach Grossbuchstabe gefolgt von mindestens null, maximal zwei Kleinbuchstaben. Wiederhohle dies so oft es geht, packe jeden Treffer in einen eigenen Match. MatchCollection allMatchResults = r.Matches(myTexteingabe.Text); bool bedingungWahr = r.IsMatch(myTexteingabe.Text); myTextausgabe.Text = bedingungWahr.ToString(); if (allMatchResults.Count > 0) { //allMatchResults.Item[0]; //ist der erste Treffer. //allMatchResults.Item[1]; //entsprechend der zweite. }
Und woher kommt das .Item[]?
Und natürlich würde ich mich über Hinweise auf Fehlern und Verbesserungen in dem Code freuen.
Ich freue mich, dass ihr so hilfsbereit meine Fragen beantwortet, danke
-
- 28.11.2012, 06:42
- #8
also den bedingungWahr brauchst du m.E. gar nicht, da du bei allMatchResults.Count nur grösser Null bekommst, wenn wirklich was gefunden wurde, ist ja klar.
im moment solltest du da in myTextausgabe.Text stehen haben "true" oder "wahr". weiss gerade nicht, wie die Lokalisation da greift.
jedenfalls wolltest du ja die Molmasse berechnen. also hast du nun in einer Klasse alle Elemente des Moleküls.
über .Item[0] kannst du auf einzelne Elemente der Klasse MatchCollection zugreifen.
allMatchResults ist etwas komplexer als als ein Array, aber auch kein Hexenwerk. ein ZAG reicht
guckstdu doku: http://msdn.microsoft.com/de-de/libr...ollection.aspx
-
Mich gibt's schon länger
- 28.11.2012, 22:37
- #9
die Zeile mit bool habe ich nur zum ausprobieren genutzt, ob überhaupt das was ich geschrieben hat etwas ausgibt. da ich nicht weiß wie ich den ersten Wert korrekt ausgebe. Habe noch nie mit regex gearbeitet. Aber ich komme nicht drauf wie ich einfach die .item[0] ausgebe. z.B myTextausgabe.Text = allMatchResults.item[0]; funktioniert nicht.
Wie genau funktioniert das?
Ich komme da nicht hinter und leider hilft mir der Link auch nicht viel weiter.
Vielleicht könntest mir da jemand ein konkretes Beispiel geben. Dann könnte ich mir den Rest davon Ableiten. Bzw. selbst erarbeiten.
danke im Vorraus
-
- 28.11.2012, 23:11
- #10
also, du hast einen Regulären Ausdruck, das ist eine Art, um, zu definieren, was gesucht wird, ersetzt wird, etc. die notation ist von system und sprache abhängig, aber wiki erklärt es ganz gut: http://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck
dann hast du die Klasse MatchCollection. Damit machen wir eine neue Instanz, theoretischginge das auch mit MatchCollection new = allMatchResults, ist aber c# schnell genug für, kann man sich schenken
Wie dem auch sei, die MatchCollection ist im prinzip mal nicht viel mehr als ein Array. Aber du musst dich halt nicht um den Typ kümmern etc.
dann benutzt du die Methode (weil Funktionen von Klassen heissen Methoden) Matches des Regulären Ausdrucks r. den haben wir ja sauber initatilisiert weil gleich auch mit Inhalt befüllt.
Diese Methode nimmt nun den Ausdruck und matcht den mit dem übergebenen String (bzw. dem Zeiger darauf). Dabei liefert er treffer und das mehrfach, welche eben die Klasse MatchCollection aufnimmt.
und um ein Array zu adressieren nimmst du ja [indexnummer]. genau so auch bei der Eigenschaft .Item von MatchCollection.
und wenn du nun das auswerfen willst, machst du z.b.
Code:if (allMatchResults.Count > 0) { integer i=0; for (allMatchResults.Count) { myTextausgabe.Text+=allMatchResults.Item[i].ToString()+" und "; } i++; }
-
Mich gibt's schon länger
- 29.11.2012, 12:19
- #11
Ja danke für deine Hilfe. Aber was ich schon ausprobiert habe, um überhaupt erstmal eine Ausgabe zu sehen, war myTextausgabe.Text = allMatchResults.Item[0].ToString(); aber da hat mir der Compiler (MS Visual Studio 2012 Pro) das .Item blau unterstrichen. Wenn ich heute Nachmittag wieder zu Hause bin werde ich deine Vorschlag mal Ausprobieren und werde berichten.
Mit der kostenlosen PocketPC.ch App von meinem RM-821_eu_euro2_248 aus geschrieben.
-
Mich gibt's schon länger
- 29.11.2012, 17:30
- #12
Diese Fehlermedldung kommt und das .Item[i] wird balu unterstrichen.
Fehler 1 'System.Text.RegularExpressions.MatchCollection' enthält keine Definition für 'Item', und es konnte keine Erweiterungsmethode 'Item' gefunden werden, die ein erstes Argument vom Typ 'System.Text.RegularExpressions.MatchCollection' akzeptiert (Fehlt eine Using-Direktive oder ein Assemblyverweis?). C:\Users\Agredo\Documents\Visual Studio 2012\Projects\App\App\Molrechner.xaml.cs 54 58 App
Wie muss ich item definieren?
-
- 29.11.2012, 17:37
- #13
Using System.Text.RegularExpressions;
Mit der kostenlosen PocketPC.ch App von meinem LG-E900 aus geschrieben.
-
Mich gibt's schon länger
- 29.11.2012, 20:37
- #14
Habe ich bereits eingebunden. Wäre ja zu schön gewesen wenn es so einfach wäre
-
- 29.11.2012, 21:05
- #15
kurios. ist auf jeden Fall auf WP verfügbar: http://msdn.microsoft.com/en-us/libr...=vs.95%29.aspx und ich benutz das ja auch so. sorry, steh grad auf der Leitung, denk morgen drüber nach
-
Mich gibt's schon länger
- 30.11.2012, 06:21
- #16
ich habe den Fehler gefunden...
Code:if (allMatchResults.Count > 0) for (int i = 0; i < allMatchResults.Count; i++) { myTextausgabe2.Text += allMatchResults[i].ToString(); }
Aber danke für deine Hilfe dein Link hat dann doch noch sehr geholfen nachdem ich da auf den Hyperlink von Intem gegangen bin
-
- 30.11.2012, 06:48
- #17
cool.
ja, natürlich bekommst du das. du machst:
Code:myTextausgabe2.Text += allMatchResults[0].ToString(); //=Na myTextausgabe2.Text += allMatchResults[1].ToString(); //=Cl
Code:myTextausgabe2.Text += allMatchResults[i].ToString()+" ";
-
Mich gibt's schon länger
- 30.11.2012, 17:30
- #18
Ich muss mich echt bedanken, dass du so viel Geduld mit mir hast.
Also ich habe dein Vorschlag ausprobiert und musste feststellen, dass es nicht klappt. Darauf hin habe ich mich mir das Pattern angeguckt. Also new Regex("(?[A-Z][a-z]{0,2}))+"); und da ist mir das "+" am ende aufgefallen. Wenn ich das rauslasse trennt der Compiler bei der Ausgabe Na und Cl. Ist das jetzt soweit richtig gedacht von mir, oder komm ich jetzt nur zufällig auf das richtige Ergebnis?
---------- Hinzugefügt um 18:30 ---------- Vorheriger Beitrag war um 17:16 ----------
Kann mir vielleicht noch jemand sagen wie ich allMatchResults[i] in einem string Array z.B strArray [i] speicher?
Code:string str = allMatchResults[0].ToString(); // Klappt
Code:string[] Atom = new string[allMatchResults.Count]; for (int i = 0; i > allMatchResults.Count; i++) { Atom[i] = allMatchResults[i].Groups[0].Value; }
Ähnliche Themen
-
Hilfe beim splitten von Strings.
Von Agredo im Forum Windows Phone 7 EntwicklungAntworten: 6Letzter Beitrag: 12.09.2012, 12:15 -
HTC TD 2: Kontakte (windows original): Notizen: Strings selektieren geht nicht
Von pwallenb im Forum HTC Touch Diamond 2Antworten: 1Letzter Beitrag: 05.10.2009, 15:08
Pixel 10 Serie mit Problemen:...