Własny słownik i rozrónianie słów

0

Witam. Chce napisać program w którym z pliku wczytuję listę słówek po angielsku i ich tłumaczenie. Niestety mam problem gdy odpowiedz ma więcej niż 1 tłumaczenie np.: angle - kąt, haczyk. Znakiem separacji jest, i nie wiem jak to odróżniać tzn gdy użytkownik wpisze kąt to żeby pokazało że to jest poprawna odpowiedz. Poniżej znajduje się moje rozwiązanie i byłbym wdzięczny za wskazówki jak sobie poradzić z tym problemem.

    StreamReader pl = new StreamReader("pl.txt");
        StreamReader ang = new StreamReader("ang.txt");
        string linie1;
        string linie2;
        List<string> polskie = new List<string>();
        List<string> angielskie = new List<string>();
        Random x = new Random();
        int y;
        while ((linie1 = pl.ReadLine()) != null && (linie2 = ang.ReadLine()) != null)
        {
            polskie.Add(linie1);
            angielskie.Add(linie2);
        }

        string opcja= " ";
        Console.WriteLine("0. Wyjdz");
        Console.WriteLine("1. Polsko - angielskie");
        Console.WriteLine("2. Angielsko - polskie");
        opcja = Console.ReadLine();
        if(opcja=="1")
        {
            while (opcja != "0")
            {
                y = x.Next(0, polskie.Count);
                Console.WriteLine(polskie[y]);
                opcja = Console.ReadLine();
                Console.Clear();
                Console.WriteLine("0. Wyjdz");
                if (opcja == angielskie[y])
                {
                    Console.WriteLine("Prawodiłowo!!!");
                }
                else
                {
                    Console.WriteLine("Zle. Odpowiedz to: " + angielskie[y]);
                }
            }
        }
        else
        {
            while (opcja != "0")
            {
                y = x.Next(0, polskie.Count);
                Console.WriteLine(polskie[y]);
                opcja = Console.ReadLine();
                Console.Clear();
                Console.WriteLine("0. Wyjdz");
                if (opcja == angielskie[y])
                {
                    Console.WriteLine("Prawodiłowo!!!");
                }
                else
                {
                    Console.WriteLine("Zle. Odpowiedz to: " + angielskie[y]);
                }
            }
        }
0

No skoro masz separator, to wystarczy użyć metody Split z klasy string, żeby rozbić tego stringa po przecinku na 2 elementy. Gdzie jest problem? Czyżbyś nie spojrzał, jakie metody ma klasa string?

0

Wiem że istnieje taka funkcja jak Split. Tylko jak potem pamiętać że oba wyrazy są tego samego tłumaczenia?

1

Przecież tutaj aż się prosi skorzystać... ze słownika w sensie struktury danych :)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Serialization;
using System.IO;

namespace App
{
    public class Word
    {
        public string Key { get; set; }
        public List<string> Values { get; set; }
    }

    public class LanguageDictionary
    {
        private Dictionary<string, List<string>> words;
        public LanguageDictionary()
        {
            this.Load("dict.txt");
        }

        public void Translate(string word)
        {
            if (this.words.ContainsKey(word))
                Console.WriteLine(string.Join(", ", this.words[word]));
            else
                Console.WriteLine("Word doesn't exists.");
        }

        public void Save(string path)
        {
            var serial = new XmlSerializer(typeof(List<Word>));
            using (var stream = new StreamWriter(path))
            {
                serial.Serialize(stream, this.words.Select(w => new Word { Key = w.Key, Values = w.Value }).ToList());
            }
        }

        public void Load(string path)
        {
            var deserial = new XmlSerializer(typeof(List<Word>));
            using (var stream = new StreamReader(path))
            {
                this.words = ((List<Word>)deserial.Deserialize(stream))
                    .ToDictionary(w => w.Key, w => w.Values);
            }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var dict = new LanguageDictionary();
            dict.Translate("angle");
            dict.Translate("apple");

            dict.Save("dict.txt");
        }
    }
}

A co do zapisu i odczytu skorzystaj z serializacji do XML. Oszczędzisz sobie 70% pisania kodu, który właśnie przedstawiłeś. Będziesz mógł zapisywać całe kolekcje nie martwiąc się w żaden sposób formatowaniem danych.

Przykładowy plik wynikowy ze słownikiem:

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfWord xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Word>
    <Key>angle</Key>
    <Values>
      <string>kąt</string>
      <string>haczyk</string>
    </Values>
  </Word>
  <Word>
    <Key>castle</Key>
    <Values>
      <string>zamek</string>
    </Values>
  </Word>
</ArrayOfWord>

1 użytkowników online, w tym zalogowanych: 0, gości: 1