J'ai une liste d'objets et je veux les réorganiser aléatoirement à chaque requête. Quelle est la meilleure façon de faire cela?Quelle est la meilleure façon de réorganiser aléatoirement une liste d'éléments dans C#?
Répondre
Que diriez-vous d'une sorte 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]);
}
Code tiré de Coding Horror. C'est aussi une lecture recommandée sur la façon dont les gens font souvent ce mal.
Ma solution préférée pour mélanger des choses est d'utiliser un tri N * log N et de lui transmettre un prédicat de tri qui retourne un résultat aléatoire. Il a la fonctionnalité intéressante qui peut être fait avec un minimum de nouveau code en utilisant des blocs de construction que la plupart des langues ont à portée de main, même dans les versions les plus rayées.
Sur la D'autre part, un shuffle est seulement O (n) et est seulement environ 5 lignes de code, comme indiqué dans les autres réponses. (Et peut être fait une seule fois avec des génériques très facilement.) –
5 lignes à 1 ligne est soit pas beaucoup (seulement 4 lignes) ou beaucoup (80%). Aussi, c'est plus simple à retenir. – BCS
Et l'autre avantage est que le type pourrait tirer parti de quelque chose pour obtenir une bonne perf sur les swaps, donc pour un petit n, il pourrait être plus rapide. – BCS
Vous pouvez utiliser l'algorithme Fisher-Yates shuffle qui s'exécute en temps linéaire.
Produit des résultats incorrects - voir http://www.codinghorror.com/blog/archives/001015.html –
@LFSR: relire l'article? – Jimmy
Qu'en est-il de Knuth? :( – configurator
Permettez-moi de vous diriger vers un MAL façon de le faire, et comme je l'avoue, j'utilisé auparavant, et n'a jamais vu l'erreur jusqu'à ce blog:
Cela montre aussi la * bonne * manière de le faire :) –
Je voudrais créez une nouvelle liste et remplissez-la avec des éléments qui sont sélectionnés au hasard et supprimés de la liste originale.
Vérifiez cette façon Linq fraîche de le faire:
public class Employee
{
public int Id
{
get;
set;
}
public string Name
{
get;
set;
}
}
POPULATE une liste:
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" });
Puis tri:
list = list.OrderBy(emp => Guid.NewGuid()).ToList();
Pas exactement rapide, mais friggen génial. – Will
Qui se soucie de la performance quand vous pouvez sortir votre gros bâton LINQ et montrer aux autres que vous êtes meilleur qu'eux? :-P – BFree
Rappelez-vous que les GUID ne sont ** PAS ** à traiter comme des nombres aléatoires à des fins de chiffrement. Ils vont travailler pour ce genre de chose, mais ils ne sont pas interchangeables. –
- 1. Meilleure façon de réorganiser une ArrayList en Java
- 2. Quelle est la meilleure façon de formater C# dans WordPress?
- 3. Quelle est la meilleure façon de stocker une liste de messages/arbre fileté dans SQL?
- 4. Quelle est la meilleure façon d'écrire [0..100] en C#?
- 5. Quelle est la meilleure façon de trier une liste partiellement ordonnée?
- 6. Quelle est la meilleure façon d'enregistrer un RichTextFile en C#?
- 7. En C#, quelle est la meilleure façon d'enchaîner les constructeurs?
- 8. Quelle est la meilleure façon d'échantillonner/profiler une application PyObjC?
- 9. Quelle est la meilleure façon de dupliquer fork() dans Windows?
- 10. C# - Quelle est la meilleure façon d'obtenir une liste des semaines dans un mois, compte tenu d'un jour de semaine?
- 11. Quelle est la meilleure façon d'appliquer une ombre portée?
- 12. Quelle est la meilleure façon de tester qu'un C# DateTime est une minute, heure, mois, etc
- 13. Quelle est la meilleure façon d'initialiser une application?
- 14. Quelle est la meilleure façon de lire les données CSV?
- 15. Quelle est la meilleure façon de localiser un IEnumerable?
- 16. Quelle est la meilleure façon de vérifier si l'option actuellement sélectionnée dans une liste déroulante est la dernière?
- 17. Quelle est la meilleure façon de faire ce programme Java?
- 18. Quelle est la meilleure façon de trier une table de données dans ADO.NET
- 19. Quelle est la meilleure façon d'utiliser JQuery dans Asp.net
- 20. Quelle est la meilleure façon de rechercher une valeur de dictionnaire Python dans une liste de dictionnaires?
- 21. Quelle est la meilleure façon d'écrire dans un fichier Ruby?
- 22. Quelle est la meilleure façon de trouver l'inverse de datetime.isocalendar()?
- 23. Quelle est la meilleure façon de gérer plusieurs connexions de base de données dans C#
- 24. Quelle est la meilleure façon de déboguer un écrasement explorer.exe?
- 25. Quelle est la meilleure façon de structurer un projet?
- 26. Quelle est la meilleure façon de lire GetResponseStream()?
- 27. quelle est la meilleure façon de marquer un texte?
- 28. Quelle est la meilleure façon d'automatiser le remplacement de texte?
- 29. Quelle est la meilleure façon de gérer les exceptions ObjectDataSource?
- 30. Quelle est la meilleure façon de supprimer les espaces après un certain caractère dans une chaîne?
Cela devrait vraiment faire partie de la bibliothèque standard .net class ... – Pyrolistical