我想计算文本文件中重复字符的数量..
我写了这段代码
foreach(char c in File.ReadAllText(path))
{
if(dic.ContainsKey(c))
{
int i=dic[c];
dic[c]=i++;
}
else
{
dic.Add(c,1);
}
}
它添加了所有唯一的字词,但即使有重复的字符,它也会显示所有键的值1
!
答案 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] += 1
或dic[c]++
。在您的代码中,赋值增量运算符在赋值发生后递增i
,因此它对dic[c]
的值没有影响。
答案 3 :(得分:2)
dic[c]=i++;
转换为
dic[c] = i;
i = i++;
i
不是参考值,因此放在字典中的i
的值在字典外增加后不会改变。
改为使用dic[c]++;
。
答案 4 :(得分:1)
这是因为i
受dict[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