web-dev-qa-db-ja.com

文字列の配列から最後のアイテムを削除する

私は単純なブラックジャックゲームプロジェクトに取り組んでいます。まず、カードの配列を作成します。

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

4を掛けてdeckNumberを与えるより:

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

アレイから最後のカードを削除したい場合、これを適用します:

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

問題は、コードが配列から最後のアイテムを削除せず、複数の配列があるように動作し、それらからすべての最後の要素を削除することです。たとえば、1つのデッキの場合:

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 

removeコマンドを適用すると、次のようになります。

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 

配列からすべてのAを削除します。しかし、配列全体から最後の項目のみを削除したいです。どうすればこれを解決できますか?

36
JayGatsby

最後の要素だけを削除するには、これを使用します:

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

ソリューションは、最後の要素に等しいすべての要素を削除します。文字列の場合、これはAに等しいすべての要素を削除することを意味します

65
Flat Eric

Array classを使用してサイズを変更できます:

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

@Flat Ericは、ソリューションが機能しない理由を説明しました。

最後の要素を削除する別の方法を次に示します。

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

明確化:

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

これにより、配列の最後の要素が削除されます。

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