我目前尝试创建一个小程序,用户在文本区域输入一个字符串,单击一个按钮,程序计算字符串中不同字符的频率,并在另一个文本区域显示结果。 例如。第1步: - 用户输入: - aaabbbbbbcccdd 第2步: - 用户单击按钮 第3步: - 3 b 6 c 3 d 1 这就是我到目前为止所做的......
public partial class Form1 : Form
{
Dictionary<string, int> dic = new Dictionary<string, int>();
string s = "";
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
s = textBox1.Text;
int count = 0;
for (int i = 0; i < s.Length; i++ )
{
textBox2.Text = Convert.ToString(s[i]);
if (dic.Equals(s[i]))
{
count++;
}
else
{
dic.Add(Convert.ToString(s[i]), count++);
}
}
}
}
}
任何想法或帮助我如何计算,因为到目前为止,当有相同的字符时,程序会出现运行时错误!!
谢谢
答案 0 :(得分:1)
var lettersAndCounts = s.GroupBy(c=>c).Select(group => new {
Letter= group.Key,
Count = group.Count()
});
答案 1 :(得分:1)
而不是dic.Equals
使用dic.ContainsKey
。但是,我会使用这个小linq查询:
Dictionary<string, int> dict = textBox1.Text
.GroupBy(c => c)
.ToDictionary(g => g.Key.ToString(), g => g.Count());
答案 2 :(得分:0)
我将建议采用另一种更简单的方法来做到这一点。假设您正在使用英语字符串,则可以创建容量= 26的数组。然后,根据您遇到的字符,您将增加数组中的相应索引。例如,如果字符在索引0处为'a'增量计数,则如果字符为'b',则在索引1处增加计数等等...
您的实现将如下所示:
int count[] = new int [26] {0};
for(int i = 0; i < s.length; i++)
{
count[Char.ToLower(s[i]) - int('a')]++;
}
完成此操作后,您将获得计数[0]中的'a'和计数[25]中的'z'的数量。
答案 3 :(得分:0)
您正在尝试将整个字典与字符串进行比较,该字符串不会告诉您字典中是否存在与字符串对应的键。由于字典永远不等于字符串,因此您的代码将始终认为它应该添加一个新项目,即使已存在,也是运行时错误的原因。
使用ContainsKey
方法检查字符串是否作为字典中的键存在。
您可能希望增加字典中的数字,而不是使用变量count
,并初始化一个计数为1的新项目:
string key = s[i].ToString();
textBox2.Text = key;
if (dic.ContainsKey(key)) {
dic[key]++;
} else {
dic.Add(key, 1);
}