Tengo una lista de objetos y quiero reordenarlos aleatoriamente en cada solicitud. Cual es la mejor manera de hacer esto?¿Cuál es la mejor manera de reorganizar aleatoriamente una lista de elementos en C#?
Respuesta
¿Qué tal un tipo de Knuth-Fisher-Yates shuffle algorithm?
for (int i = cards.Length - 1; i > 0; i--)
{
int n = rand.Next(i + 1);
Swap(ref cards[i], ref cards[n]);
}
Código tomado de Coding Horror. Esta es también una lectura recomendada sobre cómo las personas a menudo hacen esto mal.
Mi solución favorita para mezclar cosas es utilizar un tipo N * log N y pasarle un predicado de clasificación que arroje un resultado aleatorio. Tiene la característica agradable de que se puede hacer con un mínimo de código nuevo usando bloques de construcción que la mayoría de los lenguajes tienen a mano incluso en las versiones más rayadas.
Por por otro lado, una mezcla aleatoria es solo O (n) y solo tiene unas 5 líneas de código, como se muestra en otras respuestas. (Y se puede hacer solo una vez con genéricos muy fácilmente.) –
5 líneas a 1 línea no es mucho (solo 4 líneas) o mucho (80%). También es más simple de recordar. – BCS
Y la otra ventaja es que el género podría aprovechar algo para obtener un buen rendimiento en los swaps, por lo que para n pequeño podría ser más rápido. – BCS
Puede usar el algoritmo Fisher-Yates shuffle que se ejecuta en tiempo lineal.
Produce resultados incorrectos - vea http://www.codinghorror.com/blog/archives/001015.html –
@LFSR: lea el artículo otra vez? – Jimmy
¿Qué hay de Knuth? :( – configurator
Déjeme directo a una MAL forma de hacerlo, y una manera confieso he usado antes, y nunca vi el error de él hasta esta entrada del blog:
Eso también muestra la forma * correcta * de hacerlo :) –
lo haría crea una nueva lista y llénala con elementos que se seleccionan al azar y se eliminan de la lista original.
Salida este fresco manera LINQ de hacerlo:
public class Employee
{
public int Id
{
get;
set;
}
public string Name
{
get;
set;
}
}
rellenar una lista:
List<Employee> list = new List<Employee>();
list.Add(new Employee { Id = 1, Name = "Davolio Nancy" });
list.Add(new Employee { Id = 2, Name = "Fuller Andrew" });
list.Add(new Employee { Id = 3, Name = "Leverling Janet" });
list.Add(new Employee { Id = 4, Name = "Peacock Margaret" });
list.Add(new Employee { Id = 5, Name = "Buchanan Steven" });
list.Add(new Employee { Id = 6, Name = "Suyama Michael" });
list.Add(new Employee { Id = 7, Name = "King Robert" });
list.Add(new Employee { Id = 8, Name = "Callahan Laura" });
list.Add(new Employee { Id = 9, Name = "Dodsworth Anne" });
Luego ordenar:
list = list.OrderBy(emp => Guid.NewGuid()).ToList();
No es exactamente rápido, pero increíble. – Will
¿A quién le importa el rendimiento cuando puedes sacar tu gran stick LINQ y mostrarle a otros que eres mejor que ellos? :-P – BFree
Solo recuerde que los GUID ** ** no se tratan como números aleatorios para criptografía. Trabajarán para este tipo de cosas, pero no son intercambiables. –
- 1. Mezclar elementos en una lista (reorganizar elementos de la lista aleatoriamente)
- 2. La mejor manera de reorganizar un ArrayList en Java
- 3. ¿Cuál es la mejor manera de copiar una lista?
- 4. ¿Cuál es la mejor manera de barajar un NSMutableArray?
- 5. ¿Cuál es la mejor manera de ordenar la lista con parámetros de clasificación personalizados en Python?
- 6. ¿Cuál es la mejor manera de escribir comentarios en C?
- 7. ¿Cuál es la mejor manera de enumerar una lista en lenguaje natural (Scala)?
- 8. ¿Mejor manera de verificar si hay elementos en la lista?
- 9. ¿Cuál es la mejor manera de codificar una lista desplegable de mes y año para ASP.NET?
- 10. ¿Cuál es la mejor manera de fundir una lista en un vector?
- 11. La mejor manera de eliminar los elementos de la lista en un bucle en C#
- 12. Hibernar: la mejor manera de eliminar elementos en una colección
- 13. ¿Cuál es la mejor manera de representar una lista inmutable en .NET?
- 14. ¿Cuál es la mejor manera de crear una matriz de solo lectura en C#?
- 15. ¿Cuál es la mejor manera de analizar una gramática simple?
- 16. ¿Cuál es la mejor manera de declarar una variable global?
- 17. ¿Cuál es la mejor manera de obtener los últimos N elementos de una matriz Perl?
- 18. La mejor manera de eliminar elementos de una colección
- 19. ¿Cuál es la mejor manera de ordenar una lista parcialmente ordenada?
- 20. ¿Cuál es la mejor manera de incluir condicionalmente un elemento en una lista?
- 21. ¿Cuál es la mejor manera de crear una matriz de crecimiento dinámico en Scala?
- 22. ¿Cuál es la mejor manera de crear una matriz dispersa en C++?
- 23. ¿Cuál es la mejor manera de deducir una mesa?
- 24. ¿Cuál es la mejor manera de atrapar una excepción IllegalArgumentException
- 25. ¿cuál es la mejor manera de verificar una matriz vacía?
- 26. Cuál es la mejor manera de autorizar una llave USB
- 27. ¿Cuál es la mejor manera de incrementar una enumeración?
- 28. ¿Cuál es la mejor manera de construir una NSCompoundPredicate compleja?
- 29. ¿Cuál es la mejor manera de perfilar una aplicación Sinatra?
- 30. ¿Cuál es la mejor manera de implementar una aplicación Pylons?
Esto realmente debería ser parte de la biblioteca de clases de .NET estándar ... – Pyrolistical