C# dictonary - automatyczne uzupełnienie z pliku TXT

0

Witam,
Nie zbyt wiem, jak poprawnie stworzyć mapę wartości wyczytanych z plików i użyć ich w programie do kodowania słów metodą - znak po znaku.

Zrobiłem coś takiego:

 string[] lines = System.IO.File.ReadAllLines(@"C:\przetlumaczone.txt");
            foreach (string line in lines)
            {
                string[] dane = Regex.Split(line, "->");
                Dictionary<string, string> mapa = new Dictionary<string, string>();
                mapa.Add(dane[0], dane[1]);
            }

I pytanie czy to jest dobrze ? i co dalej ?
Mój słowik w txt wygląda tak:
a -> $
b -> #
c -> !

itd. Czyli jak podam do kodowania słowo abb to dostanę $## jak do odkodowania !## to dostanę cbb

Mam to zrealizowane na drzewku IF'ów, ale ich jest w sumie ponad 200, to może tą metodą byłoby lepiej.

Koduję tak:

string cos = textBox3.Text;
                string wynik = "";
                for (int i = 0; i < cos.Length; i++)
                {
                    if (cos[i] == '\n') wynik+= '\n';
                    if (cos[i] == ' ') wynik += " ";
                    if (cos[i] == 'a') wynik += "$";
                 // itd
                  }

To jak by to wyglądało wykorzystując mapę którą piszę ? No i czy w ogóle poprawnie się za nią zabieram ?

0
wynik += mapa[cos[i]]
0

a w cos[i] dalej zostaje słownik (bo to jest tablica ze słówkami), on już nie powinien korzystać z tego co zaczerpnąłem z pliku TXT ?

0

nie rozumiem, jak to w cos[i] zostaje słownik? wydawało mi się, że to jest kolejna litera stringa do przetłumaczenia. mapa[cos[i]] pobiera z mapy wartość dla klucza cos[i], czyli jak rozumiem przetłumaczoną wartość. Dla bezpieczeństwa możesz sprawdzić przed tą operacją, czy mapa zawiera podany klucz, metodą ContainsKey().

0

można by to zrobić w ten sposób że na stałe na początku programu masz duży słownik z wartościami typu Dictionary<LITERKA, ZNACZEK> i potem dla każdego znaku/linii w tym pliku szukasz odpowiedniego ID w tym słowniku (w tym przypadku jest to pierwsza wartość to ID). aczkolwiek to się wiąże z wpisywaniem wszystkich liter i znaków, trochę uciążliwe.

Jeżeli możesz sam narzucić jaka literka odpowiada za jaki znaczek to wtedy jesteśmy w domu. Po prostu sprawdź kod ascii DEC literki i pierwszego znaku specjalnego, przykładowo dla literki "A" kod to 65 a pierwszy znak to "spacja" i ma kod 32, 65-32 = 33, taka jest różnica, przelatujesz pętlą, generujesz cały słownik i heja banana.

0
Dictionary<string, string> mapa = new Dictionary<string, string>();

// Wczytywanie...

string cos = "Ala ma kota.";
var wynik = String.Empty;
foreach (var znak in cos)
{
	var key = znak.ToString(CultureInfo.InvariantCulture);
	if (mapa.ContainsKey(key))
		wynik += mapa[key];
}

// To samo tylko w formie LINQ;
// string wynik = cos.Select(znak => znak.ToString(CultureInfo.InvariantCulture)).Where(mapa.ContainsKey).Aggregate("", (current, key) => current + mapa[key]);

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