Um método para contar ocorrências em uma lista

Existe uma maneira simples de contar o número de ocorrências de todos os elementos de uma lista na mesma lista em C #?

Algo assim:

using System; using System.IO; using System.Text.RegularExpressions; using System.Collections.Generic; using System.Linq; string Occur; List Words = new List(); List Occurrences = new List(); // ~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]); } } 

Que tal algo como isso …

 var l1 = new List() { 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() ); } 

Editar por comentário: vou tentar fazer justiça. 🙂

No meu exemplo, é um Func porque minha lista é ints. Então, estou dizendo ao GroupBy como agrupar meus itens. A Func pega um int e retorna a chave do meu agrupamento. Neste caso, eu irei obter um IGrouping (um agrupamento de ints typescripts por um int). Se eu mudasse para ( i => i.ToString() ) por exemplo, eu estaria digitando meu agrupamento por uma string. Você pode imaginar um exemplo menos trivial do que digitar “1”, “2”, “3” … talvez eu faça uma function que retorne “um”, “dois”, “três” para serem minhas chaves …

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

Então, esse é um Func que levaria um int e retornaria uma string, assim como …

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

Mas, como a pergunta original exigia saber o valor da lista original e sua contagem, usei um inteiro para digitar meu agrupamento inteiro para tornar meu exemplo mais simples.

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

Isto é retirado de um dos exemplos no linqpad

Você pode fazer algo assim para contar a partir de uma lista de coisas.

 IList names = new List() { "ToString", "Format" }; IEnumerable methodNames = typeof(String).GetMethods().Select(x => x.Name); int count = methodNames.Where(x => names.Contains(x)).Count(); 

Para contar um único elemento

 string occur = "Test1"; IList words = new List() {"Test1","Test2","Test3","Test1"}; int count = words.Where(x => x.Equals(occur)).Count(); 

Seu loop externo está passando por cima de todas as palavras da lista. É desnecessário e causará problemas. Remova-o e ele deve funcionar corretamente.