下套管C#字符串

时间:2016-10-25 16:18:03

标签: c# string dictionary case-insensitive

大家好我有一个小函数,它将字符串中的字符存储到字典中。该字符串可以同时包含小写字母和大写字母,我想将所有字符存储为小写或大写。基本上我希望字典将'T'和't'视为相同的键。以下是我的代码。

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

现在我尝试在这里做几件事,比如将输入字符串转换为小写作为单向或小写转换为for循环中的每个字符。

下层框架的第一种方法是正常工作,但我修改了不可变的字符串对象,所以可能不是有效的方法。我的第二种方法是工作,但我不确定在大字符串的情况下这是否有效。

任何关于使我的字典不区分大小写或者以最有效的方式降低字符串的评论?

2 个答案:

答案 0 :(得分:1)

要创建不区分大小写的密钥字典,请使用相应的constructor

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

答案 1 :(得分:-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]}