Question

Y at-il un moyen simple de compter le nombre d'occurrences de tous les éléments d'une liste dans cette même liste en C #?

Quelque chose comme ceci:

using System;
using System.IO;
using System.Text.RegularExpressions;
using System.Collections.Generic;
using System.Linq;

string Occur;
List<string> Words = new List<string>();
List<string> Occurrences = new List<string>();

// ~170 elements added. . . 

for (int i = 0;i<Words.Count;i++){
    Words = Words.Distinct().ToList();
    for (int ii = 0;ii<Words.Count;ii++){Occur = new Regex(Words[ii]).Matches(Words[]).Count;}
         Occurrences.Add (Occur);
         Console.Write("{0} ({1}), ", Words[i], Occurrences[i]);
    }
}
Était-ce utile?

La solution

Que diriez-vous quelque chose comme ça ...

var l1 = new List<int>() { 1,2,3,4,5,2,2,2,4,4,4,1 };

var g = l1.GroupBy( i => i );

foreach( var grp in g )
{
  Console.WriteLine( "{0} {1}", grp.Key, grp.Count() );
}

Modifier par commentaire: Je vais essayer de faire justice. :)

Dans mon exemple, il est un Func<int, TKey> parce que ma liste est ints. Donc, je dis GroupBy comment regrouper mes articles. Le Func prend un int et renvoie la clé pour la mon groupe. Dans ce cas, je vais obtenir un IGrouping<int,int> (un groupement de ints calée par un int). Si je l'ai changé (i => i.ToString()) par exemple, je serais Keying mon groupe par une chaîne. Vous pouvez imaginer un exemple moins trivial que la saisie d'être mes clés par « 1 », « 2 », « 3 » ... peut-être je fais une fonction qui retourne « un », « deux », « trois » ...

private string SampleMethod( int i )
{
  // magically return "One" if i == 1, "Two" if i == 2, etc.
}

Alors, c'est un Func qui prendrait un entier et retourner une chaîne, tout comme ...

i =>  // magically return "One" if i == 1, "Two" if i == 2, etc. 

Mais, puisque la question initiale a appelé à connaître la valeur de la liste initiale et il est comte, je viens d'utiliser un entier à la clé de mon groupe entier pour faire mon exemple plus simple.

Autres conseils

var wordCount =
    from word in words
    group word by word into g
    select new { g.Key, Count = g.Count() };    

est tiré de l'un des exemples dans le LINQPad

Vous pouvez faire quelque chose comme cela à compter d'une liste des choses.

IList<String> names = new List<string>() { "ToString", "Format" };
IEnumerable<String> methodNames = typeof(String).GetMethods().Select(x => x.Name);

int count = methodNames.Where(x => names.Contains(x)).Count();

Pour compter un seul élément

string occur = "Test1";
IList<String> words = new List<string>() {"Test1","Test2","Test3","Test1"};

int count = words.Where(x => x.Equals(occur)).Count();

Votre boucle extérieure est en boucle sur tous les mots de la liste. Il est inutile et vous causer des problèmes. Retirez-le et il devrait fonctionner correctement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top