2014-11-15 14 views
17

Sto lavorando a un semplice progetto di gioco del blackjack. In primo luogo ho creato la serie di schede:C# Eliminazione dell'ultimo elemento dalla matrice di stringa

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

di quanto io moltiplico 4 e dato deckNumber:

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

quando voglio cancellare l'ultima carta dalla serie I diffusa questa:

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

quindi il problema è che il codice non rimuove l'ultimo elemento dall'array, si comporta come se ci fossero più array e rimuove tutti gli ultimi elementi da essi. Per esempio con un mazzo:

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 

quando applico il mio comando remove diventa:

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 

rimuove tutto dalla gamma del A. Ma voglio rimuovere solo l'ultimo elemento dall'intero array. Qual è il problema come posso risolvere questo?

+3

In 'w => w! = NewDeck.Last()' stai confrontando le stringhe, quindi tutte le stringhe "A" sono considerate uguali, ecco perché tutte le A vengono rimosse. (Le stringhe vengono confrontate in base al valore non tramite riferimento) –

+0

Vale la pena leggere: http://stackoverflow.com/q/943635/397817 –

risposta

43

Per rimuovere solo l'ultimo elemento di utilizzare questo:

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

La soluzione rimuove tutti gli elementi che sono uguali per l'ultimo elemento. Per una stringa, ciò significa che rimuove tutti gli elementi uguali a A

7

@Flat Eric ha spiegato perché la tua soluzione non funziona.

Ecco alternativo per la rimozione dell'ultimo elemento:

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

Chiarimento:

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

È possibile utilizzare Array classe per ridimensionare:

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

Questo dovrebbe rimuovere l'ultimo elemento di il tuo array:

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