【问题标题】:Add & Increment the Key and Value in C# dictionary在 C# 字典中添加和增加键和值
【发布时间】:2020-10-06 21:15:41
【问题描述】:

我正在创建一个计数器,用于计算每个字符在字符串中出现的次数,然后将结果打印到控制台。

让我们使用这个示例字符串:

string myString = "The pen is mightier."

我希望结果是

T : 2
h : 2
e : 3
  : 2
p : 1
n : 1
i : 3
s : 1
m : 1
g : 1
r : 1
. : 1

我已将字符串转换为字符数组。

char[] charactersInString = myString.ToCharArray();

我创建了一个存储字母和计数的字典。

Dictionary<char, int> letters = new Dictionary<char, int>();

我循环遍历characterInString 数组中的每个字母,但不确定当字典不包含键时如何初始化和添加新对,或者仅当它包含键时如何更新值?

【问题讨论】:

  • dictionary 有一个 ContainsKey 函数来检查一个值是否存在,还有一个 add 函数来添加.. 记得在 1 处初始化,因为一旦你找到了第一次出现 :)
  • 还注意到字符串同时具有 'T' 和 't' 并且您将它们视为相同 - 但希望第一个出现在字典中 - 所以您应该检查 (ContainsKey(char.ToUpper( )) || ContainsKey(char.ToLower()))...

标签: c# dictionary key-value


【解决方案1】:

使用 LINQ 非常简单。

var dictionary = myString.GroupBy( x => x ).ToDictionary( x => x.Key, x => x.Count );

如果要将小写和大写视为相同,请预先将字符串强制为大写:

var dictionary = myString.ToUpper().GroupBy( x => x ).ToDictionary( x => x.Key, x => x.Count );

如果你想用传统的方式来做,你需要一个循环。

var dictionary = new Dictionary<char,int>();
foreach (var character in myString.ToUpper())
{
    if (dictionary.ContainsKey(character)) 
    {
        dictionary[character]++;
    }
    else
    {
        dictionary.Add(character, 1);
    }
}

【讨论】:

  • 这会将 'T' 和 't' 算作 2 个不同的键.. 预期结果是 'T' : 2
  • 这会将所有值添加为大写,对于他们发布的内容(添加首先出现的内容)我认为您需要检查两个键选项(ContainsKey(char.ToUpper()) || ContainsKey(char. ToLower()))
  • @audzzy 我认为您是在推断字典键通过其大小写代表字母第一次出现的情况,随后出现的次数无论大小写都计入同一个存储桶中。这似乎不是一个有用的要求;实际上,它使字典难以使用,因为为了获得特定字母的计数,您必须提前知道它的大小写,或者尝试两次检索计数。我不同意这是一个更好的答案。
  • 我不是问这个问题的人 - 我不知道用例,但如果需要的结果是帖子中的结果(他们实际上费心将 T 大写),那么这是一个差异,我认为至少应该引起注意..即使只是为了练习 c# 区分大小写也是一个应该处理的事情:)
  • 它增加带有键字符的条目的值,例如:dictionary[character] = dictionary[character] + 1;
猜你喜欢
  • 2015-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-15
  • 2019-12-17
  • 2018-10-19
  • 1970-01-01
相关资源
最近更新 更多