Pregunta

¿Hay una manera sencilla para contar el número de apariciones de todos los elementos de una lista en la misma lista en C #?

Algo como esto:

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]);
    }
}
¿Fue útil?

Solución

¿Qué tal algo como esto ...

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() );
}

Editar por comentario: Voy a tratar de hacer justicia. :)

En mi ejemplo, es una Func<int, TKey> porque mi lista es enteros. Por lo tanto, yo estoy diciendo GroupBy cómo agrupar mis artículos. El Func toma un int y devuelve la clave para mi agrupación. En este caso, voy a tener una IGrouping<int,int> (una agrupación de enteros introducido por un int). Si lo cambié a (i => i.ToString()), por ejemplo, estaría tecleando mi agrupación por una cadena. Se puede imaginar un ejemplo menos trivial que teclear en "1", "2", "3" ... tal vez hacer una función que devuelve "uno", "dos", "tres" que son mis llaves ...

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

Por lo tanto, eso es un Func que tomaría un int y devolver una cadena, al igual que ...

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

Pero, puesto que la pregunta original llamó para conocer el valor de la lista original y su recuento, acabo de utilizar un número entero que teclear mi agrupación número entero de hacer mi ejemplo más simple.

Otros consejos

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

Esto se toma de uno de los ejemplos en el LINQPad

Puede hacer algo como esto para contar de una lista de las cosas.

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();

Para contar un único elemento

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

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

Su lazo externo es un bucle sobre todas las palabras de la lista. Es innecesario y le causa problemas. Eliminarlo y que debería funcionar correctamente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top