我正在做一个简单的二十一点游戏项目。首先,我创建了卡片数组:
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
当我应用我的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。但我只想从整个数组中删除最后一项。问题是什么?我怎么才能解决这个问题?
发布于 2014-11-15 21:16:33
要只删除最后一个元素,请使用以下命令:
newDeck = newDeck.Take(newDeck.Count() - 1).ToArray();
您的解决方案将移除与最后一个元素相等的所有元素。对于字符串,这意味着它将删除所有等于A
的元素
发布于 2016-04-27 20:41:59
您可以使用Array类来调整大小:
Array.Resize(ref result, result.Length - 1);
发布于 2014-11-15 21:36:48
@Flat Eric解释了为什么你的解决方案不起作用。
下面是删除最后一个元素的替代方法:
newDeck = newDeck.Reverse().Skip(1).Reverse().ToArray();
澄清:
[a, b, c] => Reverse => [c, b, a] => Skip(1) => [b, a] => Reverse() => [a, b]
https://stackoverflow.com/questions/26946196
复制相似问题