从字符串数组中删除最后一项

Jay*_*sby 38 c# arrays blackjack

我正在研究一个简单的二十一点游戏项目.首先我创建了一系列卡片:

string[] deck = { "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", };
Run Code Online (Sandbox Code Playgroud)

比我乘以4并给出deckNumber:

newDeck = Enumerable.Repeat(deck, deckNumber*4).SelectMany(x => x).ToArray();
Run Code Online (Sandbox Code Playgroud)

当我想从数组中删除最后一张卡时我应用此:

newDeck = newDeck.Where(w => w != newDeck.Last()).ToArray();
Run Code Online (Sandbox Code Playgroud)

所以问题是代码不会从数组中删除最后一项,就像有多个数组一样,并从中删除所有最后一个元素.例如,有一个套牌:

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 
Run Code Online (Sandbox Code Playgroud)

当我应用我的删除命令时,它变为:

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 
Run Code Online (Sandbox Code Playgroud)

它从数组中删除所有A.但我想只从整个数组中删除最后一项.问题是怎么解决这个问题?

Fla*_*ric 68

要删除最后一个元素,请使用:

newDeck = newDeck.Take(newDeck.Count() - 1).ToArray();
Run Code Online (Sandbox Code Playgroud)

您的解决方案将删除所有与最后一个元素相同的元素.对于字符串,这意味着,它会删除所有等于的元素A

  • 您可以使用“.SkipLast(1)”代替“newDeck.Take(newDeck.Count() - 1)”。 (2认同)
  • @felixfbecker `SkipLast()` 不是标准的 linq 方法。它在诸如“MoreLinq”之类的 3rd 方项目中实现 (2认同)
  • @felixfbecker这是一个.NET Core方法.大多数人仍然使用常规的.NET Framework. (2认同)

Ahm*_*lan 21

您可以使用Array类来调整大小:

Array.Resize(ref result, result.Length - 1);
Run Code Online (Sandbox Code Playgroud)

  • 我刚刚尝试过将这种方法与Flat Eric的方法(.Take)进行比较,并且此方法(.Resize`)的速度始终更快。我的意思是始终如一,就像我下注很大笔的钱一样。数组越长,差异越大。 (2认同)

hal*_*ldo 16

C# 8.0如果您使用(released with .net 3.0) 或以上版本,则可以轻松删除数组的最后一项。

您可以通过将“帽子” ^运算符与范围 运算符组合来删除最后一项..

newDeck = newDeck[..^1];  // all items in the array except the last
Run Code Online (Sandbox Code Playgroud)

^和的其他一些例子..

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
Run Code Online (Sandbox Code Playgroud)

在线演示


小智 7

@Flat Eric解释了为什么你的解决方案不起作用.

这是删除最后一个元素的替代方法:

newDeck = newDeck.Reverse().Skip(1).Reverse().ToArray();
Run Code Online (Sandbox Code Playgroud)

澄清:

[a, b, c] => Reverse => [c, b, a] => Skip(1) => [b, a] => Reverse() => [a, b]
Run Code Online (Sandbox Code Playgroud)