Kontext: Ein Kartenspiel; Ich möchte jedem Spieler im Spiel Karten von einem Deck auf saubere Art und Weise austeilen.Elegante Technik, um Objekte von einem Array zum anderen zu bewegen
Dies ist, was ich im Sinn hatte:
public static CardGame.IGame DealAll(this CardGame.IGame objThis, CardGame.Card[] cards)
{
if (objThis.Players.Length > 0)
{
for (int i = 0; i < cards.Length; i++)
{
objThis.Deck.MoveTo(cards[i], objThis.CurrentPlayer.Hand);
objThis.AdvancePlayer();
}
}
return objThis;
}
public static Card[] MoveTo(this Card[] objThis, Card card, Card[] cards)
{
List<Card> lstCards = cards.ToList();
List<Card> lstThis = objThis.ToList();
lstThis.Remove(card);
lstCards.Add(card);
objThis = lstThis.ToArray();
cards = lstCards.ToArray();
return cards;
}
Sicherlich können Sie die Referenz Probleme sehen. Die Verwendung des Schlüsselworts ref führt zu etwas nicht so gut aussehenden Code, aber es kann unvermeidlich sein. Irgendwelche Vorschläge?
Ich würde eine Lösung bevorzugen, die flexibel genug ist, um andere "Kartenpass" -Situationen zu bewältigen (ein Spieler spielt eine Karte auf den Stapel, zieht Karten vom Stapel auf ein "Müll" -Deck usw.).
Ich hatte nicht von der Queue-Klasse gehört, aber ich werde es ausprobieren. Ich habe es versäumt, dies zu erwähnen, aber ich möchte etwas, das flexibel genug ist, um es in anderen "Kartenpass" -Situationen zu verwenden (Karten spielen, Karten auf das "Müll" -Deck verschieben usw.). Verlängerungsmethoden erschienen geeignet. –
Ich denke, dass Sie auf diese Weise mit mehr verschachteltem Code enden werden. Ich würde ernsthaft vorschlagen, es zuerst auf die einfachste Art und Weise zu schreiben, und dann Wiederverwendung zu erwägen, wenn Sie tatsächlich ähnlichen Code an mehreren Stellen haben. –
FWIW, ich stimme Jon zu. Erweiterungsmethoden sollten verwendet werden, wenn Sie das Verhalten einer Klasse erweitern und nicht steuern möchten.Sie müssen das Verhalten von Sammlungen jedoch nicht erweitern. Sie wollen nur Dinge tun, die Sammlungen beinhalten. –