web-dev-qa-db-fra.com

Une méthode pour compter les occurrences dans une liste

Existe-t-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 ça:

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]);
    }
}
43
Nona Urbiz

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 rendre cette justice. :)

Dans mon exemple, c'est un Func<int, TKey> Parce que ma liste est en pouces. Donc, je dis à GroupBy comment grouper mes articles. Le Func prend un int et retourne la clé de mon regroupement. Dans ce cas, j'obtiendrai un IGrouping<int,int> (Un regroupement d'entiers saisis par un int). Si je le changeais en (i => i.ToString()) par exemple, j'incrusterais mon groupement par une chaîne. Vous pouvez imaginer un exemple moins trivial que la saisie par "1", "2", "3" ... peut-être que je fais une fonction qui renvoie "un", "deux", "trois" pour être mes clés ...

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

Donc, c'est un Func qui prendrait un int et retournerait une chaîne, comme ...

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

Mais, puisque la question d'origine appelait à connaître la valeur de liste d'origine et son nombre, j'ai simplement utilisé un entier pour saisir mon regroupement d'entiers afin de simplifier mon exemple.

74
JP Alioto

Vous pouvez faire quelque chose comme ça pour compter à partir d'une liste de 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();
14
Stan R.
var wordCount =
    from Word in words
    group Word by Word into g
    select new { g.Key, Count = g.Count() };    

Ceci est tiré de l'un des exemples du linqpad

14
Steve Mitcham