2017-10-08 3 views
0

Je souhaite compter le nombre d'occurrences de chaque mot figurant dans une liste.
C'est ma fonction qui compte l'apparitionComptabiliser le nombre d'occurrence de chaque mot dans une liste de formulaires C# windows

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

Et c'est là que j'utiliser 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); 
    } 

} 

Si dans la liste que j'ai ces valeurs:
salut
sa
me
me
le résultat est la suivante:
enter image description here

Les chiffres sont justes, mais je veux que le résultat soit comme ceci:
enter image description here

Que dois-je ajouter ou supprimer de le code?
Je vais apprécier toute sorte d'aide :)

Modifier:
Je ne suis pas en mesure d'utiliser la méthode Count ().

+0

Pourquoi utilisez-vous ArrayList? Pourquoi pas tableau ou liste? str.Distinct(). ToList(); devrait supprimer les doublons, mais retourne une liste. –

Répondre

1

remplacer cette

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

avec ce

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


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

Vous pouvez réaliser vos besoins très facilement en utilisant 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()); 
} 

Version sans 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

Cela fonctionne très bien mais j'ai oublié d'écrire dans la publication que je ne peux pas utiliser la méthode _Count() _. – Sisi

+0

Ajoutez juste votre boucle alors: int count = 0; foreach (chaîne s en g) compte ++; – Steve

0

Vous pouvez utiliser Distinct

foreach (string str in arrList.Distinct()) 
2

Vous pouvez compter l'apparition d'éléments simplement de cette façon:

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