1

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

我写了这段代码

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

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

4

6 回答 6

3

我想你想要:

dic[c] = i + 1;

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

dic[c] = ++i;

解释:

i++是一个后增量操作。这意味着它分配 to 的当前然后递增。因此,总而言之,您总是在阅读 in ,将back 放入字典中,然后在将其发送到 void 之前递增to 。idic[c] ii=1i=1i2


附录:

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

于 2013-10-28T17:00:42.733 回答
3

i++将对 的值加一,i在增量之前返回 的值i。你不想那样做。您只想返回i加一的值。为此,只需编写:

dic[c] = i+1;

在旁注中,您可以使用 LINQ 来完成整个操作:

var dic = File.ReadAllText(path).GroupBy(c => c)
    .ToDictionary(group => group.Key, group => group.Count());
于 2013-10-28T17:02:47.237 回答
2

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

于 2013-10-28T17:01:41.610 回答
2

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

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

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

改为使用dic[c]++;

于 2013-10-28T17:01:42.697 回答
1

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

if(dic.ContainsKey(c))
{
    dic[c] += 1;
}
于 2013-10-28T17:03:12.057 回答
0
    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
于 2013-10-28T17:09:52.377 回答