web-dev-qa-db-fra.com

Suppression du dernier élément du tableau de chaînes

Je travaille sur un simple projet de jeu de blackjack. Tout d'abord je crée le tableau de cartes:

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

que je multiplie 4 et étant donné deckNumber:

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

quand je veux supprimer la dernière carte du tableau, j'applique ceci:

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

le problème est donc que le code ne supprime pas le dernier élément du tableau, agit comme s'il y avait plusieurs tableaux et en supprime tous les derniers éléments. Par exemple avec un pont:

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 

quand j'applique ma commande remove, cela devient:

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 

il supprime tous les A du tableau. Mais je veux supprimer uniquement le dernier élément de l'ensemble du tableau. Quel est le problème, comment puis-je résoudre ce problème?

28
JayGatsby

Pour ne supprimer que le dernier élément, utilisez ceci:

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

Votre solution supprime tous les éléments égaux au dernier élément. Pour une chaîne, cela signifie que tous les éléments égaux à A sont supprimés.

55
Flat Eric

Vous pouvez utiliser Array class pour redimensionner:

Array.Resize(ref result, result.Length - 1);
15
Ahmet Arslan

@Flat Eric a expliqué pourquoi votre solution ne fonctionnait pas.

Voici une alternative pour supprimer le dernier élément:

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

Clarification: 

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

Cela devrait supprimer le dernier élément de votre tableau:

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