Deleting Last Item from Array of String

C#ArraysBlackjack

C# Problem Overview


I'm working on a simple blackjack game project. Firstly I create the array of cards:

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

than I multiply it 4 and given deckNumber:

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

when I want to delete last card from array I apply this:

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

so the problem is that code doesn't removes last item from array, acts like there are multiple arrays and removes all last elements from them. For example with one 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 

when I apply my remove command it become:

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 

it removes all the A's from array. But I want to remove only the last item from whole array. Whats the problem how can I solve this?

C# Solutions


Solution 1 - C#

To remove just the last element use this:

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

Your solution removes all Elements that are equal to the last element. For a string, this means, it removes all elements equal to A

Solution 2 - C#

You can use Array class to resize:

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

Solution 3 - C#

@Flat Eric explained why your solution is not working.

Here is alternate for removing last element:

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

Clarification:

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

Solution 4 - C#

It's easy to remove the last item of an array if you're using C# 8.0 (released with .net 3.0) or above.

You can remove the last item by combining the "hat" ^ operator with the range .. operator:

newDeck = newDeck[..^1];  // all items in the array except the last

Some other examples of ^ and ..:

var lastItem   = newDeck[^1];    // last item in array
var allItems   = newDeck[..];    // all items
var skipTwo    = newDeck[2..];   // all items except the first 2 items
var innerItems = newDeck[1..^1]  // all items except the first and last

Online demo

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJayGatsbyView Question on Stackoverflow
Solution 1 - C#Flat EricView Answer on Stackoverflow
Solution 2 - C#Ahmet ArslanView Answer on Stackoverflow
Solution 3 - C#user2160375View Answer on Stackoverflow
Solution 4 - C#haldoView Answer on Stackoverflow