Este es el tipo de tarea para la cual es LINQ muy adecuado.
En primer lugar, vamos a definir lo que estamos haciendo:
- Grupo de los artículos por valor
- contar cada grupo
- Vuelva el artículo cuyo grupo tiene el mayor número de
Este consulta implementa lo anterior:
private string GetMostFrequent(IEnumerable<string> items)
{
var itemsOrderedByCount =
from item in items
group item by item into itemGroup
orderby itemGroup.Count() descending, itemGroup.Key
select itemGroup.Key;
return itemsOrderedByCount.FirstOrDefault();
}
La implementación se parece mucho a la descripción de alto nivel, un agradable efecto secundario de la sintaxis declarativa.Aquí hay una explicación rápida de cada parte:
from item in items
es como una declaración de bucle; item
se refiere a la variable de bucle.
group item by item into itemGroup
Esto pone a cada uno item
en un grupo con base en su valor.
orderby itemGroup.Count() descending, itemGroup.Key
Esto cuenta cada grupo y los clasifica de manera tal que el más frecuente es el primero. Si hay dos grupos con el mismo conteo, se elige el valor menor. (A medida que cada grupo contiene todos los mismos valores, la clave es el elemento contado.)
select itemGroup.Key
Esto dice que para cada grupo, sólo queremos que el elemento contado.
return itemsOrderedByCount.FirstOrDefault();
Esto toma el primer elemento de la lista ordenada (el que tiene el conteo más alto). Si la secuencia original está vacía, se devuelve null.
Uso:
var items = new[] { "BOB", "JOHN", "TOM", "TOM", "TOM" };
Assert.AreEqual("TOM", GetMostFrequent(items));