【问题标题】:Deleting Last Item from Array of String从字符串数组中删除最后一项
【发布时间】:2015-01-12 19:13:27
【问题描述】:

我正在开发一个简单的二十一点游戏项目。首先我创建卡片数组:

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();

所以问题是代码不会从数组中删除最后一项,就像有多个数组并从它们中删除所有最后一个元素一样。以一副甲板为例:

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 

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

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。但我只想从整个数组中删除最后一项。有什么问题怎么解决?

【问题讨论】:

  • w => w != newDeck.Last() 中,您正在比较字符串,因此所有字符串“A”都被认为是相等的,这就是所有A 都被删除的原因。 (字符串是按值比较,而不是按引用)

标签: c# arrays blackjack


【解决方案1】:

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

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

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

【讨论】:

  • 你可以使用newDeck.Take(newDeck.Count() - 1),而不是.SkipLast(1)
  • @felixfbecker SkipLast() 不是标准的 linq 方法。它在MoreLinq 等第三方项目中实现
  • @felixfbecker 这是一个 .NET Core 方法。大多数人仍然使用常规的 .NET Framework。
  • 我刚刚尝试了这种方法 (.Take) 与 Ahmet 的方法 (.Resize) 相比,.Resize 始终更快。我的意思是一贯的,就像我会赌一大笔钱一样。数组越长,差异越大。
【解决方案2】:

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

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

【讨论】:

  • 我刚刚尝试过这种方法与 Flat Eric 的方法 (.Take) 相比,这种方法 (.Resize) 始终更快。我的意思是一贯的,就像我会赌一大笔钱一样。数组越长,差异越大。
  • 同意。速度提升也不错。 ;-)
【解决方案3】:

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

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

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

澄清:

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

【讨论】:

    【解决方案4】:

    如果您使用C# 8.0(与.net 3.0 一起发布)或更高版本,则可以轻松删除数组的最后一项。

    您可以通过将 "hat" ^ 运算符与 range .. 运算符组合来删除最后一项:

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

    ^.. 的一些其他示例:

    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

    【讨论】:

      【解决方案5】:

      这应该删除数组的最后一个元素:

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

      【讨论】:

      • 这与两年前@ahmet-arslan 发布的答案完全相同。由于它没有带来任何新的东西,我相信如果你删除这个答案会更好。
      猜你喜欢
      • 1970-01-01
      • 2017-08-19
      • 2013-11-01
      • 2017-02-10
      • 2011-01-19
      相关资源
      最近更新 更多