2016-10-25 5 views
-2

Привет всем Я имею небольшую функцию, которая хранит символы в строке в словаре. Строка может содержать строчные и строчные буквы одновременно, и я хотел сохранить все символы в нижнем регистре или в верхнем регистре. В основном, я хочу, чтобы словарь обрабатывал «T» и «t» как один и тот же ключ. Ниже мой код.Нижняя оболочка C# строка

public bool CheckCharOddCount(string str1) 
{ 
    bool isOdd = false; 
    Dictionary<char, int> dt = new Dictionary<char, int>(); 

    // Dictionary is case sensitive so 'T' and 't' are treated as different keys.  
    str1 = str1.ToLower(); # One way 
    foreach (char c in str1) 
    { 
    c = char.ToLower(c);  # Another way 
    if (dt.ContainsKey(c)) 
     dt[c]++; 
    else 
     dt.Add(c, 1); 
    } 

    foreach (var item in dt) 
    { 
    if (item.Value % 2 == 1) 
    { 
     if (isOdd) 
     return false; 
     isOdd = true; 
    } 
    } 

    return true; 
} 

Теперь я пытался сделать несколько вещей здесь, как преобразование входной строки в нижний регистр как один из способов или нижний регистр каждого символа внутри для цикла.

Первый способ нижнего корпуса: строка отлично работает, но я изменяю неизменяемый строковый объект, поэтому не может быть эффективным способом. Мой второй способ работает, но я не уверен, что он эффективен в случае большой строки.

Любые комментарии по поводу того, что мой словарь нечувствителен или нижний обрезной шнур наиболее эффективным способом?

+5

S наверху, и прежде чем использовать «ToLower», перейдите и прочитайте http://haacked.com/archive/2012/07/05/turkish-i-problem-and-why-you-should-care.aspx/ и https : //blog.codinghorror.com/whats-wrong-with-turkey/ –

+0

Вам нужно будет сделать 'c = char.ToLower (c);' для этого работать. – juharr

ответ

1

Чтобы создать без учета регистра ключ словаря, используйте соответствующий constructor:

Dictionary<string, int> dictionary = new Dictionary<string, int>(
     StringComparer.CurrentCultureIgnoreCase); 
+1

У нас недостаточно информации, чтобы узнать, чувствительны ли к ней группы или нет, но, скорее всего, ответ будет либо CurrentCultureIgnoreCase, либо OrdinalIgnoreCase. Использование InvariantCulture обычно является ошибкой. См. Http://stackoverflow.com/questions/492799/difference-between-invariantculture-and-ordinal-string-comparison –

+0

@PsychomaticComplexity, вы правы, я исправил его. –

-1

Если вы имеете дело с только на английском языке, это Oneliner будет делать работу:

string s = "AaaaAcWhatever"; 
Dictionary<char, int> dic = s.GroupBy(c => char.ToLower(c)) 
          .Select(g => new { Key = g.Key, Count = g.Count()}) 
          .ToDictionary(x => x.Key.First(), x => x.Count); 

Выход:

Count = 8 
[0]: {[a, 6]} 
[1]: {[c, 1]} 
[2]: {[w, 1]} 
[3]: {[h, 1]} 
[4]: {[t, 1]} 
[5]: {[e, 2]} 
[6]: {[v, 1]} 
[7]: {[r, 1]} 
+0

Почему бы не группировать 'char.ToLower (c)' и избегать промежуточных строк? – juharr

+0

@juharr Я забыл об этом:/исправлено сейчас, спасибо. –

 Смежные вопросы

  • Нет связанных вопросов^_^