C# Werte vergleichen aus txt.Datei?
Moin Moin,
ich entwickel zurzeit einen Vokabeltrainer in C#. Die Vokabeln sollen in einer GUI ausgegeben werden und über eine txt.Datei eingelesen werden. Ich selbst bin noch nicht so weit fortgeschritten, Lehrbücher bringen allerdings nicht mehr - darum dieses Projekt.
Im ersten Schritt habe ich eine txt-Datei entworfen, die Vokabeln in folgender Struktur abspeichert:
hallo, hello;
tag, day;
flasche, bottle;
Diese txt.Datei möchte ich in mein C# Programm als Array einlesen, das habe ich wie folgt gemacht:
String[] values = File.ReadAllText("Wörter.txt").Split(',');
Im nächsten Schritt soll aus diesem Array in einem deutschen Textfeld, ein zufälliges deutsches Wort des Arrays angezeigt werden:
txtDEUTSCH.Text = values[random.Next(values.Length)];
Wie erreiche ich nun das nur der deutsche Part angezeigt wird? Und wie kann ich gleichzeitig den zweiten Teil der Zeile speichern, so dass ich mit einem "Prüfen-Button" einfach nur die Übereinstimmung der Übersetzung prüfen kann?
Ich bin dankbar für jede Hilfe...
3 Antworten
Ich finde diese Datenstruktur der Textdatei ausgesprochen ungünstig gewählt. Was ist beispielsweise, wenn ein Fremdwort mehrere Bedeutungen hat? Wie willst Du die trennen? Aber gut...
Du kannst jeden Eintrag in der Textdatei ja als Paar von Werten sehen. Der erste Wert ist in Deinem Fall immer das Fremdwort, der zweite immer "das" deutsche Wort.
Somit kannst Du die Tuple<string, string> Klasse verwenden, denn die ist genau für sowas da. Somit wäre eine Vokabel:
Tuple<string, string> vokabel = new Tuple<string, string>(values[0], values[1]);
Wenn Du eine Liste davon hast, also List<Tuple<string,string>> list beispielsweise, dann wäre der Zugriff auf das deutsche Wort eben:
textBox1.Text = list<i>.Item1
Lehrbücher bringen allerdings nicht mehr
In Deinem Fall schon, denn offensichtlich mangelt es an spezifischem Wissen zu objektorientierter Programmierung und dem Entwurf von Datenstrukturen.
Die am leichtesten erweiterbare Lösung wäre, eine der eingebauten Klassen zu nehmen und damit den Text zu "parsen". Das ist aber was Fortgeschritteneres.
Du könntest die Daten einmal nach ';' und dann nach ',' zerlegen.
(Besser wäre aber, üblichere Teiler zu nehmen - einen Zeilenumbruch für Datensätze (hier: Wortpaare) und ein Tabulatorzeichen für die Felder eines Datensatzes.)
Die am leichtesten umsetzbare Lösung - für genau diese Struktur der Daten - wäre wohl:
String[] lines = File.ReadAllLines(filename);
String[] wordpairstrings = lines.Select(s => s.Split(';')[0].Trim()).ToArray();
String[][] words = wordpairstrings.Select<String, String[]>(s => s.Split(',').Select(s2 => s2.Trim()).ToArray()).ToArray();
Geht natürlich auch mit Schleifen:
String[] lines = File.ReadAllLines(filename);
String[] wordpairstrings = new String[lines.Length];
for (int i = 0; i < lines.Length; i++) {
wordpairstrings[i] = lines[i].Split(';')[0];
wordpairstrings[i] = wordpairstrings[i].Trim();
}
String[][] words = new String[lines.Length][];
for (int i = 0; i < lines.Length; i++) {
words[i] = wordpairstrings[i].Split(',');
for (int j = 0; j < words[i].Length; j++){
words[i][j] = words[i][j].Trim();
}
Hi,
du solltest dich mit Klassen auseinandersetzen.
die Klasse Vokabel enthält dann einen deutschen und einen englischen Parameter.
class Vokabel
{
private string _deutscherText;
public string Deutsch
{
get { return _deutscherText; }
}
private string _englischerText;
public string Englisch
{
get { return _englischerText; }
}
public Vokabel(string deutsch,string englisch)
{
_deutscherText = deutsch;
_englischerText = englisch;
}
}
so zum Beispiel.
Das kannst du dann wiederrum als Array oder List initialisieren und abrufen.
Lehrbücher bringen allerdings nicht mehr -> kann ich nicht so ganz nachvollziehen, da Klassen essentiell sind.
VG