无法更改字典键的值

本文关键字:字典 | 更新日期: 2023-09-27 18:37:13

我想计算文本文件中重复字符的数量。

我写了这段代码

foreach(char c in File.ReadAllText(path))
{
    if(dic.ContainsKey(c))
    {
        int i=dic[c];
        dic[c]=i++;
    }
    else
    {
        dic.Add(c,1);
    }
}

它添加了所有独特的单词,但它显示所有键的值1即使有重复的字符!

无法更改字典键的值

我想你想要:

dic[c] = i + 1;

或者可能,尽管恕我直言,这只会增加复杂性,因为您在以下之后不使用i

dic[c] = ++i;

解释:

i++递增后操作。这意味着它将 i当前值分配给 dic[c],然后递增i 。所以总而言之,你总是在i=1阅读,把i=1放回字典里,然后在i增加到2,然后再把它发送到虚空。


补遗:

你根本不需要通过临时变量。您可以使用 dic[c] += 1; 简单地在一个操作中读取和分配值,甚至可以使用 dic[c]++; 递增它。

i++会将 1 添加到 i 的值,但在增量之前返回 i 的值。 你不想那样做。 您只想返回递增 1 的 i 的值。 为此,只需写:

dic[c] = i+1;

附带说明一下,您可以使用 LINQ 来代替地完成整个操作:

var dic = File.ReadAllText(path).GroupBy(c => c)
    .ToDictionary(group => group.Key, group => group.Count());

你想要dic[c] = i + 1;dic[c] += 1dic[c]++。在您的代码中,post 增量运算符在分配发生后递增i,因此它对 dic[c] 的值没有影响。

dic[c]=i++;翻译为

dic[c] = i;
i = i++;

i不是参考值,因此在字典外递增后,放置在字典内的i值不会更改。

请改用dic[c]++;

这是因为i在受到影响后会递增dict[c]。试试这个:

if(dic.ContainsKey(c))
{
    dic[c] += 1;
}
    Dictionary<char, int> LetterCount(string textPath)
    {
        var dic = new Dictionary<char, int>();
        foreach (char c in System.IO.File.ReadAllText(textPath))
        {
            if (dic.ContainsKey(c))
                dic[c]++;
            else
                dic.Add(c, 1);
        }
        return dic;
    }

然后像这样使用:

var letters = LetterCount(@"C:'Text.txt");
// letters will contain the result