2014-11-15 7 views
17

Ich arbeite an einem einfachen Blackjack-Spielprojekt. Zunächst erstelle ich das Array von Karten:C# Löschen des letzten Eintrags aus String-Array

string[] deck = { "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", }; 

als ich es multiplizieren 4 und deckNumber gegeben:

newDeck = Enumerable.Repeat(deck, deckNumber*4).SelectMany(x => x).ToArray(); 

, als ich letzte Karte aus dem Array gelöscht werden soll ich mich bewerben diese:

newDeck = newDeck.Where(w => w != newDeck.Last()).ToArray(); 

Das Problem besteht also darin, dass der Code das letzte Element nicht aus dem Array entfernt, so wirkt, als gäbe es mehrere Arrays, und entfernt alle letzten Elemente aus ihnen. Zum Beispiel mit einem Deck:

cards: 2 3 4 5 6 7 8 9 10 J Q K A 2 3 4 5 6 7 8 9 10 J Q K A 2 3 4 5 6 7 8 9 10 J Q K A 2 3 4 5 6 7 8 9 10 J Q K A 

, wenn ich meinen Befehl remove anwenden wird es:

cards: 2 3 4 5 6 7 8 9 10 J Q K 2 3 4 5 6 7 8 9 10 J Q K 2 3 4 5 6 7 8 9 10 J Q K 2 3 4 5 6 7 8 9 10 J Q K 

es alle von Arrays A entfernt. Aber ich möchte nur das letzte Element aus dem ganzen Array entfernen. Was ist das Problem, wie kann ich das lösen?

+3

In 'w => w! = NewDeck.Last()' vergleicht man Strings, also werden alle Strings "A" als gleich betrachtet, deshalb werden alle A's entfernt. (Strings werden nach Wert nicht durch Referenz verglichen) –

+0

Eine Lektüre wert: http://stackoverflow.com/q/943635/397817 –

Antwort

43

So entfernen Sie nur das letzte Element verwenden:

newDeck = newDeck.Take(newDeck.Count() - 1).ToArray(); 

Ihre Lösung entfernt alle Elemente, die auf das letzte Element gleich sind. Für eine Zeichenkette bedeutet dies, dass alle Elemente gleich A

7

entfernt werden @Flat Eric erklärte, warum Ihre Lösung nicht funktioniert.

Hier alternative zum Entfernen letzte Element:

newDeck = newDeck.Reverse().Skip(1).Reverse().ToArray(); 

Klarstellung:

[a, b, c] => Reverse => [c, b, a] => Skip(1) => [b, a] => Reverse() => [a, b] 
8

Sie Array Klasse verwenden können, um die Größe:

Array.Resize(ref result, result.Length - 1); 
0

Dies ist das letzte Element entfernen sollte Ihr Array:

Array.Resize(ref newDeck, newDeck.Length - 1);