¿Existe alguna manera rápida y agradable de utilizar linq?Encuentra el número que ocurre más en una lista <int>
Respuesta
¿Qué tal:
var most = list.GroupBy(i=>i).OrderByDescending(grp=>grp.Count())
.Select(grp=>grp.Key).First();
o en la sintaxis de consulta:
var most = (from i in list
group i by i into grp
orderby grp.Count() descending
select grp.Key).First();
Por supuesto, si va a utilizar esto en varias ocasiones, se podría añadir un método de extensión:
public static T MostCommon<T>(this IEnumerable<T> list)
{
return ... // previous code
}
Entonces puede usar:
var most = list.MostCommon();
Eso es lo que estaba tratando de hacer, pero mi cerebro simplemente no está funcionando en este momento. –
¿Qué pasa si más de un elemento es la respuesta? –
@Varun - buena pregunta; pero no es difícil adaptarse a –
No está seguro acerca de las expresiones lambda, pero me
Ordenar la lista [O (n log n)]
Busque en la lista [O (n)] encontrar la pista más larga -longitud.
Escanear de nuevo [O (n)] informando cada número que tenga esa longitud de ejecución.
Esto se debe a que podría haber más de un número que se produce con mayor frecuencia.
Alguien pidió una solución donde hay vínculos. Aquí está una puñalada en la que:
int indicator = 0
var result =
list.GroupBy(i => i)
.Select(g => new {i = g.Key, count = g.Count()}
.OrderByDescending(x => x.count)
.TakeWhile(x =>
{
if (x.count == indicator || indicator == 0)
{
indicator = x.count;
return true;
}
return false;
})
.Select(x => x.i);
Tomado de mi respuesta here:
public static IEnumerable<T> Mode<T>(this IEnumerable<T> input)
{
var dict = input.ToLookup(x => x);
if (dict.Count == 0)
return Enumerable.Empty<T>();
var maxCount = dict.Max(x => x.Count());
return dict.Where(x => x.Count() == maxCount).Select(x => x.Key);
}
var modes = { }.Mode().ToArray(); //returns { }
var modes = { 1, 2, 3 }.Mode().ToArray(); //returns { 1, 2, 3 }
var modes = { 1, 1, 2, 3 }.Mode().ToArray(); //returns { 1 }
var modes = { 1, 2, 3, 1, 2 }.Mode().ToArray(); //returns { 1, 2 }
yo fuimos para una prueba de rendimiento entre el enfoque de arriba y David B'sTakeWhile
.
fuente = {}, iteraciones = 1000000
mío - 300 ms, el David de - 930 msfuente = {1}, iteraciones = 1000000
minas - 1070 ms, el David de - 1560 msfuente = 100 + INT con 2 duplicados, iteraciones = 10000
minas - 300 ms, el David de - 500 msfuente = 10000 ints aleatorios con aproximadamente 100 + d uplicates, iteraciones = 1000
minas - 1280 ms, de David - 1400 ms
Aquí hay otra respuesta, que parece ser rápida. Creo que Nawfal's answer es generalmente más rápido, pero esto podría sombrearlo en largas secuencias.
public static IEnumerable<T> Mode<T>(
this IEnumerable<T> source,
IEqualityComparer<T> comparer = null)
{
var counts = source.GroupBy(t => t, comparer)
.Select(g => new { g.Key, Count = g.Count() })
.ToList();
if (counts.Count == 0)
{
return Enumerable.Empty<T>();
}
var maxes = new List<int>(5);
int maxCount = 1;
for (var i = 0; i < counts.Count; i++)
{
if (counts[i].Count < maxCount)
{
continue;
}
if (counts[i].Count > maxCount)
{
maxes.Clear();
maxCount = counts[i].Count;
}
maxes.Add(i);
}
return maxes.Select(i => counts[i].Key);
}
- 1. Encuentra el número más cercano en una lista de números
- 2. Python - Encuentra el número más grande en una lista de números
- 3. Encuentra el valor más cercano en una lista de ordererd
- 4. Encuentra el número más pequeño no utilizado en SQL Server
- 5. Encuentra el número más pequeño en Arreglo rotativo ordenado
- 6. Encuentra el número N-ésimo más frecuente en la matriz
- 7. Objetivo-C: ¿Cuenta el número de veces que un objeto ocurre en una matriz?
- 8. Encuentra el valor más grande más pequeño que x en una matriz ordenada
- 9. Encuentra el objeto datetime más antiguo/más joven en una lista
- 10. ¿Cuál es la función integrada que encuentra el número primo siguiente más grande en Java?
- 11. problema que ocurre en __flash__addCallback
- 12. ¿Lista <object[]> usando más memoria que DataTable?
- 13. Encuentra la lista más anidada dentro de una lista en Common Lisp
- 14. Encuentra el número de ángulos internos de un polígono, más grande que 180º
- 15. ¿Encuentra la potencia más grande de dos menos que el número X?
- 16. ¿Encuentra el valor máximo en una lista desplegable usando jQuery?
- 17. ¿Por qué una lista simple <T> parece ser más lenta que una ArrayList?
- 18. ¿El diccionario <TKey, TValue> es más rápido que LINQ en una lista <T>?
- 19. elementos de filtro que sólo ocurre una vez en una lista muy grande
- 20. El número más frecuente en una matriz
- 21. Encuentra cuatro números consecutivos que suman el número dado
- 22. lista de Python mayor que el número
- 23. Sintaxis más corta para el lanzamiento de una lista <X> a una lista <Y>?
- 24. Encuentra vacíos en una lista de números
- 25. encuentra el algoritmo de submatriz más grande
- 26. Encuentra un número primo?
- 27. Python - Encuentra el color dominante/más común en una imagen
- 28. Encuentra los x enteros más pequeños en una lista de longitud n
- 29. Encuentra el color más común en una imagen
- 30. Encuentra elementos de una lista que no está en la segunda lista (en Scala)
@AakashM, Es casi seguro que por expresiones lambda OP significaba linq, y no algún delegado/enfoque de expresión. No tengo idea de por qué se revertió la edición. – nawfal
@nawfal 1) no hay forma de sospechar lo que este usuario no registrado significaba hace 4 años o menos, y menos aún de estar "casi seguro".2) [tag: find-occurrences] es una etiqueta pobre y, en cualquier caso, inapropiada. 3) La palabra "linq" no es código y, por lo tanto, no debe formatearse como código. En mi opinión, hay tres partes en el mejor cuestionario para editar, pero son perfectamente válidas para la reversión, pero no dudes en llevarlo a meta si no estás de acuerdo. – AakashM
@AakashM Estoy de acuerdo con 3. Sin embargo, la esencia de mi edición fue una pregunta más sensata. Podría haber eliminado la etiqueta inapropiada (?), Y también el formato del código si eso es lo que importa al volver a editar en lugar de revertir. Así que ahora, * en cualquier caso, etiqueta inapropiada *, ¿para qué tipo de preguntas es más adecuada? 2) ¿Qué crees que debe haber significado OP por * lambda expressions *? Mi punto es que ** hay una manera de sospechar ** haber estado en el círculo C# por un tiempo, y es una fuerte sospecha dada la respuesta que OP ha elegido. – nawfal