统计c#窗体窗体列表框中每个单词的出现次数

问题描述:

我想统计列表框中每个单词的出现次数。
这是我的函数计算发生统计c#窗体窗体列表框中每个单词的出现次数

public int CountWords(ArrayList list, string item) 
{ 
    int count = 0; 
    foreach (string str in list) 
    { 
     if (item == str) 
      count++; 
    } 
    return count; 
} 

而这正是我使用CountWords - >

private void button4_Click(object sender, EventArgs e) 
{ 
    listBox3.Items.Clear(); 
    ArrayList arrList = new ArrayList(); 
    int count = 0; 
    foreach (object item in listBox2.Items) 
    { 
     arrList.Add(item); 
    } 

    foreach (string str in arrList) 
    { 
     count = obj.CountWords(arrList, str); 
     listBox3.Items.Add(str + ": " + count); 
    } 

} 

如果在列表框中我有这样的价值观:




结果是这样的:
enter image description here

的计数是正确的,但我希望得到的结果是这样的:
enter image description here

我应该怎么添加或删除代码?
我会感谢任何形式的帮助:)

编辑
我不能够使用COUNT()方法

+0

为什么要使用ArrayList的?为什么不是数组或列表? str.Distinct()ToList();应删除重复项,但返回一个列表。 – 2017-10-08 13:12:03

替换此

foreach (string str in arrList) 
     { 
      count = obj.CountWords(arrList, str); 
      listBox3.Items.Add(str + ": " + count); 
     } 

与此

foreach (string str in arrList) 
       { 
         string_Item=string.Concat(str,":",obj.CountWords(arrList, str)); 


        if (!listBox3.Items.Contains(_Item)) 
        { 
         listBox3.Items.Add(_Item); 
        } 
       } 

可以达到()的要求,很容易使用LINQ的GroupBy

private void button4_Click(object sender, EventArgs e) 
{ 
    listBox3.Items.Clear(); 
    var temp = listBox2.Items.Cast<string>().GroupBy(s => s); 
    foreach(var g in temp) 
     listBox3.Items.Add(g.Key + ": " + g.Count()); 
} 

版本不计数

private void button4_Click(object sender, EventArgs e) 
{ 
    listBox3.Items.Clear(); 
    var temp = listBox2.Items.Cast<string>().GroupBy(s => s); 
    foreach(var g in temp) 
    { 
     int count = 0; foreach(string s in g) count++; 
     listBox3.Items.Add(g.Key + ": " + count); 
    } 
} 
+0

这很好,但我忘了在帖子中写我不能使用_Count()_方法。 – Sisi

+0

然后只需添加你的循环:int count = 0; foreach(string s in g)count ++; – Steve

您可以使用distinct

foreach (string str in arrList.Distinct()) 

你可以指望的项目只是这样发生:

listBox2.DataSource = listBox1.Items.Cast<object>().GroupBy(x => x) 
           .Select(x => $"{x.Key}:{x.Count()}").ToList();