C# 字符数组如何存储字符以及每个字符的计数?

C# 字符数组如何存储字符以及每个字符的计数?,c#,algorithm,C#,Algorithm,这是我的代码,它有一个字符数组和字符变量 char[] chArr = new char[1000]; char ch='A'; chArr[0]= 'D'; //chArr[ch] = chArr[ch] + 1; //fails to compile chArr[ch]++ ; //works. But how can it store character and its count that too only with ++? 在这里的最后一行中,

这是我的代码,它有一个字符数组和字符变量

    char[] chArr = new char[1000];
    char ch='A';
    chArr[0]= 'D';
    //chArr[ch] = chArr[ch] + 1; //fails to compile
    chArr[ch]++ ; //works. But how can it store character and its count that too only with ++?
在这里的最后一行中,它增加了字符A的计数,而不是增加一个字符“B”。虽然我知道它不应该这样做。但我想了解它是如何在这里存储每个字符及其计数的,当它仅与++运算符一起使用时,而不是通过执行chArr[ch]=chArr[ch]+1


我理解这一点,因为它是许多关于字谜的算法的基础。

当你做
chArr[ch]++
时,它会增加数组中索引
ch
处的值

由于
chArr[]
包含字符,因此这将增加字符,使其成为序列中的下一个字符-因此它将
'A'
转换为
'B'
,或
'B'
转换为
'C'
,依此类推。例如,如果
'A'
的值为65,则向其中添加一个值将使其成为66,这是
'B'
的字符代码

(您的示例是将1添加到代码为0的字符(nul字符),这将生成代码为1的字符(SOH或“标题开头”字符),但无论实际字符代码如何,原则都是相同的。)

理论上,你可以用它来计算角色出现的次数(达到一定的限制),因为你可以用适当的施法将角色视为一个计数数字,但这是一个不好的方法;你不应该把字符当作计数

这不会编译:

chArr[ch] = chArr[ch] + 1;
因为
chArr[ch]+1
被转换成一个
int
来做算术运算,然后不能把它放回char数组中

但是:

在执行递增操作时,不会将字符转换为int,因此它编译为ok

请注意,以下行将编译为OK,因为我们将
int
结果转换回
char
,然后再将其放入char数组中:

chArr[ch] = (char)(chArr[ch] + 1);
还要注意,
chArr[ch]++
相当于执行上述操作,这就是它编译的原因

编译器理解,它需要将结果视为与数组相同的类型,以便它看起来像是为您执行强制转换

你真正想做什么?

如果您的目标是统计每个字符的出现次数,那么应该使用
int
数组,因为您对计数感兴趣。你想完成什么

附录

如果确实要计算某个文本中所有字符的出现次数,一个好方法是使用
字典
,其中每个字符映射到整数计数。计数后,如果某个字符未出现在字典中,则表示该字符未出现在字符串中

代码如下所示:

string testString = "The owls are not what they seem.";

var counts = new Dictionary<char, int>();

foreach (var ch in testString)
{
    if (!counts.ContainsKey(ch))
        counts.Add(ch, 0);

    ++counts[ch];
}

foreach (var count in counts)
    Console.WriteLine("{0}: {1} times.", count.Key, count.Value);
string testString=“猫头鹰不是它们看上去的样子。”;
var counts=新字典();
foreach(testString中的var ch)
{
如果(!counts.ContainsKey(ch))
计数。添加(ch,0);
++计数[ch];
}
foreach(计数中的变量计数)
WriteLine(“{0}:{1}次。”,count.Key,count.Value);

执行
chArr[ch]+
操作时,它会增加数组中索引
ch
处的值

由于
chArr[]
包含字符,因此这将增加字符,使其成为序列中的下一个字符-因此它将
'A'
转换为
'B'
,或
'B'
转换为
'C'
,依此类推。例如,如果
'A'
的值为65,则向其中添加一个值将使其成为66,这是
'B'
的字符代码

(您的示例是将1添加到代码为0的字符(nul字符),这将生成代码为1的字符(SOH或“标题开头”字符),但无论实际字符代码如何,原则都是相同的。)

理论上,你可以用它来计算角色出现的次数(达到一定的限制),因为你可以用适当的施法将角色视为一个计数数字,但这是一个不好的方法;你不应该把字符当作计数

这不会编译:

chArr[ch] = chArr[ch] + 1;
因为
chArr[ch]+1
被转换成一个
int
来做算术运算,然后不能把它放回char数组中

但是:

在执行递增操作时,不会将字符转换为int,因此它编译为ok

请注意,以下行将编译为OK,因为我们将
int
结果转换回
char
,然后再将其放入char数组中:

chArr[ch] = (char)(chArr[ch] + 1);
还要注意,
chArr[ch]++
相当于执行上述操作,这就是它编译的原因

编译器理解,它需要将结果视为与数组相同的类型,以便它看起来像是为您执行强制转换

你真正想做什么?

如果您的目标是统计每个字符的出现次数,那么应该使用
int
数组,因为您对计数感兴趣。你想完成什么

附录

如果确实要计算某个文本中所有字符的出现次数,一个好方法是使用
字典
,其中每个字符映射到整数计数。计数后,如果某个字符未出现在字典中,则表示该字符未出现在字符串中

代码如下所示:

string testString = "The owls are not what they seem.";

var counts = new Dictionary<char, int>();

foreach (var ch in testString)
{
    if (!counts.ContainsKey(ch))
        counts.Add(ch, 0);

    ++counts[ch];
}

foreach (var count in counts)
    Console.WriteLine("{0}: {1} times.", count.Key, count.Value);
string testString=“猫头鹰不是它们看上去的样子。”;
var counts=新字典();
foreach(testString中的var ch)
{
如果(!counts.ContainsKey(ch))
计数。添加(ch,0);
++计数[ch];
}
foreach(计数中的变量计数)
WriteLine(“{0}:{1}次。”,count.Key,count.Value);
为什么有C和C作为标记?他们对这些东西的处理非常复杂