Mam metodę, która pobiera IDictionary jako parametr. Teraz chcę podać metodę, która pobiera wartość z tego słownika, ale powinna być niezmienna.Konwertuj identyfikator <string, string> keys na małe litery (C#)
Więc moje rozwiązanie tego właśnie teraz miał mieć statyczną funkcję pętle za pomocą przycisków i konwertuje je tolower() tak:
private static IDictionary<ILanguage, IDictionary<string, string>> ConvertKeysToLowerCase(
IDictionary<ILanguage, IDictionary<string, string>> dictionaries)
{
IDictionary<ILanguage, IDictionary<string, string>> resultingConvertedDictionaries
= new Dictionary<ILanguage, IDictionary<string, string>>();
foreach(ILanguage keyLanguage in dictionaries.Keys)
{
IDictionary<string, string> convertedDictionatry = new Dictionary<string, string>();
foreach(string key in dictionaries[keyLanguage].Keys)
{
convertedDictionatry.Add(key.ToLower(), dictionaries[keyLanguage][key]);
}
resultingConvertedDictionaries.Add(keyLanguage, convertedDictionatry);
}
return resultingConvertedDictionaries;
}
Teraz, to jest ok, ale nadal jest to dość ogromny fragment kodu, który zaprzecza mojej idei "czystej i wydajnej". Czy znasz jakieś alternatywy do tego, aby metoda .ContainsKey() w słowniku nie rozróżniała obudowy?
Dzięki! Udało się, ale wciąż muszę przejrzeć słownika ILanguage i ręcznie dodać słowniki. Nie mogę się tego pozbyć? –
Tigraine
Nie, że mogę od razu pomyśleć. To tylko jedna pętla ... prawie nieczytelna. Jeśli używasz .NET 3.5, możesz prawdopodobnie usprawnić to * trochę *, ale nie spociłbym się. Czy potrafisz zmienić twórcę oryginalnego słownika, aby w pierwszej kolejności określić porównawczy bez rozróżniania wielkości liter? –
To wydaje się być najlepszym rozwiązaniem, ponieważ Tigraine chce osiągnąć porównanie polegające na ignorowaniu przypadków, a konwersja kluczy na małe litery jest tylko jedną (niepotrzebną) drogą do osiągnięcia tego celu. – VVS