Correctement à l'aide de LINQ to shuffle un pont
J'essaie d'écrire un simple jeu de cartes. Dans un effort pour arriver à un bon brassage de l'algorithme, je suis tombé sur Jeff Atwood est post sur le code de l'Horreur.
Cependant Quand j'ai vue le contenu de l'objet après l'appel du Constructeur, ils ne sont pas mélangées.
Voici ma tentative d'utilisation de Jeff Solution:
class MainDeck : List<Card>
{
public MainDeck()
{
this.Add(new Card(1, "Hearts"));
this.Add(new Card(2, "Hearts"));
this.Add(new Card(3, "Hearts"));
...
this.OrderBy(a => Guid.NewGuid());
}
}
voici le code de la Carte:
class Card
{
string suit;
int value;
public Card(int value, string suit)
{
this.value = value;
this.suit = suit;
}
bool isFaceCard()
{
if (value >= 11 || value == 1)
return true;
else
return false;
}
public override string ToString()
{
return (value +", " + suit);
}
}
Que dois-je modifier pour que le brassage de travail?
- S'il vous plaît montrer le code de la Carte. Peut-être que c'est juste moi, mais sans que je ne vois pas comment nous pouvons vous aider.
- Vous devez comprendre que
OrderBy
retourne une collection ordonnée - il n'a pas de tri en place. Je voudrais aussi valoir que Jeff est uniquement de transférer à partir d'une source de la pseudo-aléatoire à l'autre en utilisant une version modifiée de Fisher-Yates shuffle avec un décent source de l'aléatoire est plus propre qu'à l'aide de OrderBy, de l'OMI. - Code Ajouté. Toutefois, la question n'a rien à voir avec la Carte de la Classe, il a à faire avec n'importe quel type d'objet énumérable
- Comment pourrais-je commande le contenu de mon objet par le Guid alors?
- En utilisant le Guid pour le tri peut être une mauvaise idée. Voir Eric Lippert commentaire de une réponse différente que les états "Utilisation guid pour générer de l'unicité, de ne jamais l'aléatoire".
InformationsquelleAutor jth41 | 2013-10-05
Vous devez vous connecter pour publier un commentaire.
LINQ méthodes ne sont pas la mutation des collections existantes. Si cette déclaration ne fait rien du tout:
this.OrderBy(a => Guid.NewGuid());
Aussi, je suis sûr que vous ne pouvez pas attribuer à
this
, donc, il faut soit ne pas hériter deList<T>
(qui est bonne), ou de faire quelque chose comme ceci:Aussi regarder ce DONC réponse, il est plus correct de brassage de l'algorithme.
AddAll
fonction?this
se termine avec 0 éléments, après avoir tentéthis.AddRange(sorted);
ToList()
, car il n'est pas exécutée jusqu'à ce queAddRange
est appelé, de sorte que vous êtes l'exécution de la requête sur la liste vide (commeClear
a déjà été appelée). Vous devez toujours vous souvenir que les requêtes LINQ sont paresseux et différé.Essayer cette
En raison de Linq différés exécution de la ligne suivante n'est pas exécutée.
Cela crée juste de la requête, mais jamais exécuté. Même s'il est exécuté, il ne changera pas votre collection.
N'oubliez pas de Linq est une manière d'interroger les données, pas les transformer.
.Sort()
est libre d'évaluer votre lambda plusieurs fois. Au lieu de cela, vous devez utiliser.Select()
pour ajouter un nombre aléatoire dans un anonyme struct, et puis trier par qui.Utiliser cette méthode d'extension
Linq ne fonctionne pas par référence.
vous devriez obtenir le résultat dans une variable.
Créer la liste d'objets à l'intérieur de la classe au lieu d'hériter de la liste comme suit:
Veuillez marquer comme réponse ou utile si cette réponse aide.
this = this.OrderBy(a => Guid.NewGuid());
Sera cette compilation?.ToList()
trop 🙂