无法更改Dictionary键的值

时间:2013-10-28 16:59:18

标签: c# .net dictionary

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

我写了这段代码

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

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

6 个答案:

答案 0 :(得分:3)

我想你想要:

dic[c] = i + 1;

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

dic[c] = ++i;

说明:

i++后增量操作。这意味着它将i当前值分配给dic[c] ,然后递增i。总而言之,您总是在i=1中阅读,将i=1放回字典中,然后将i递增到2,然后再将其发送到空白处。


附录:

你根本不需要经历一个临时变量。您可以使用dic[c] += 1;在一个操作中简单地阅读和分配值,或者甚至将其与dic[c]++;一起递增。

答案 1 :(得分:3)

i++会在i的值中添加一个,但会在增量之前返回i的值。你不想那样做。您只想返回i增加1的值。要做到这一点,请写下:

dic[c] = i+1;

另一方面,您可以使用LINQ来完成整个事情:

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

答案 2 :(得分:2)

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

答案 3 :(得分:2)

dic[c]=i++;转换为

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

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

改为使用dic[c]++;

答案 4 :(得分:1)

这是因为idict[c]影响后会增加。试试这个:

if(dic.ContainsKey(c))
{
    dic[c] += 1;
}

答案 5 :(得分: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