2008-10-02 3 views
5

У меня есть метод, который получает IDictionary как параметр. Теперь я хочу предоставить метод, который извлекает значение из этого словаря, но он должен быть случайным.Преобразование IDictionary <строка, строка> в нижний регистр (C#)

Так что мое решение это прямо сейчас должен был иметь статическую функцию, которая перебирает ключи и преобразует их TOLOWER(), как это:

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; 
} 

Теперь, это нормально, но все равно это очень огромный кусок кода, который противоречит моей идее «чистой и эффективной». Знаете ли вы какие-либо альтернативы этому, чтобы метод .ContainsKey() словаря не различал оболочку?

ответ

29

Да - передайте конструктор словаря StringComparer.OrdinalIgnoreCase (или другой случай-игнорирующий компаратор, в зависимости от ваших потребностей в чувствительности к культуре).

Jon

+0

Спасибо! Это сработало, но мне все равно нужно просмотреть словарь языка Java и добавить словарь вручную. Никоим образом я не могу избавиться от этого? – Tigraine 2008-10-02 10:09:10

+0

Не то, чтобы я сразу подумаю. Это всего лишь одна петля, хотя ... вряд ли нечитаема. Если вы используете .NET 3.5, вы могли бы оптимизировать его * немного * бит, но я бы не потел его. Можете ли вы изменить создателя исходного словаря, чтобы в первую очередь указать нечувствительный к регистру компаратор? – 2008-10-02 10:18:21

0

Вы можете использовать вар ключевое слово, чтобы удалить некоторые помехи. Технически источник остается тем же. Кроме того, я бы просто пройти и возвращает словарь < строку, строка >, потому что вы ничего с этим параметром ILanguage не делает и делает метод более многоразовые:

private static IDictionary<string, string> ConvertKeysToLowerCase(
    IDictionary<string, string> dictionaries) 
{ 
    var convertedDictionatry = new Dictionary<string, string>(); 
    foreach(string key in dictionaries.Keys) 
    { 
     convertedDictionatry.Add(key.ToLower(), dictionaries[key]); 
    } 
    return convertedDictionatry; 
} 

... и называть это как так:

// myLanguageDictionaries is of type IDictionary<ILanguage, IDictionary<string, string>> 
foreach (var dictionary in myLanguageDictionaries.Keys) 
{ 
    myLanguageDictionaries[dictionary].Value = 
     ConvertKeysToLowerCase(myLanguageDictionaries[dictionary].Value); 
} 
1

Вы можете наследовать от IDictionary самостоятельно и просто отправлять маркер на внутренний экземпляр Dictionary.

Add(string key, string value) { dictionary.Add(key.ToLowerInvariant(), value) ; } 
public string this[string key] 
{ 
    get { return dictionary[key.ToLowerInvariant()]; } 
    set { dictionary[key.ToLowerInvariant()] = value; } 
} 
// And so forth. 
-1

LINQ версия с использованием методов IEnumerable<T> расширения:


     private static IDictionary<ILanguage, IDictionary<string, string>> ConvertKeysToLowerCase(
      IDictionary<ILanguage, IDictionary<string, string>> dictionaries) 
     { 
      return dictionaries.ToDictionary(
       x => x.Key, v => CloneWithComparer(v.Value, StringComparer.OrdinalIgnoreCase)); 
     } 

     static IDictionary<K, V> CloneWithComparer<K,V>(IDictionary<K, V> original, IEqualityComparer<K> comparer) 
     { 
      return original.ToDictionary(x => x.Key, x => x.Value, comparer); 
     } 
1

System.Collections.Specialized.StringDictionary() может помочь. MSDN гласит:

«Ключ обрабатывается регистронезависимом образом, переводится в нижний регистр, прежде чем использовать со словарем струнной

В .NET Framework версии 1.0, этот класс использует культуры чувствительны к регистру. сравнение строк. Однако в .NET Framework версии 1.1 и более поздних версиях этот класс использует CultureInfo.InvariantCulture при сравнении строк. Дополнительные сведения о том, как культура влияет на сравнение и сортировку, см. в разделе Сравнение и сортировка данных для конкретной культуры и выполнение нечувствительной к культуре строки Операции «.