好的,所以我对编程很新,但是从C#开始。我仍然是一个几乎绝对的初学者,只是写一些小项目来熟悉这门语言。我决定这就是我想玩的东西,首先我创建了一个类Deck,它有一个卡片列表。这个功能是我想用来洗牌的功能。我确实意识到这不是最有效的方式,但我想完成一个“现实”的随机播放。这也是我头脑中的草稿。代码工作1次,但一旦我调用deck.RemoveRange(0,52);它从每个列表中删除所有内容,包括NewDeck,FirstCut,SecondCut。 (这对我来说只是一个学习实验,与“什么是有用的”无关)
编辑:对令人困惑的代码道歉,在计算机理解之前,我仍然会呕吐在脑海中的任何东西。我想提一下,我知道这个问题是参考类型与价值类型的问题,我只是觉得我在创建新项目的时候实际上并没有这样做。所以我想知道它是如何应用于.RemoveRange,如果只删除一个元素或删除基本引用(书籍和视频从未解释过这个,所以我试图从这个错误中学习)。
public static List<Card> GetNewDeck(int ShuffleTimes)
{
Deck MainDeck = new Deck();
List<Card> NewDeck = MainDeck.DeckOfCards;
List<Card> ShuffledDeck = new List<Card>();
for (int i = 0; i <= ShuffleTimes; i++)
{
Random Shuffle = new Random();
var FirstCut = NewDeck;
var SecondCut = new List<Card>();
var deck = new List<Card>();
var cut = Shuffle.Next(15, 37);
for (int c = 0; c < cut; c++)
{
SecondCut.Add(FirstCut[0]);
FirstCut.RemoveAt(0);
}
while (deck.Count != 52)
{
var rif = Shuffle.Next(1, 4);
if (rif < SecondCut.Count)
{
for (int r = 0; r < rif; r++)
{
deck.Add(SecondCut[0]);
SecondCut.RemoveAt(0);
}
}
if (rif < FirstCut.Count)
{
for (int d = 0; d < rif; d++)
{
deck.Add(FirstCut[0]);
FirstCut.RemoveAt(0);
}
}
if (rif >= SecondCut.Count && SecondCut.Count != 0)
{
for (int ri = 0; ri <= SecondCut.Count; ri++)
{
deck.Add(SecondCut[0]);
SecondCut.RemoveAt(0);
}
}
if (rif >= FirstCut.Count && FirstCut.Count != 0)
{
for (int si = 0; si <= FirstCut.Count; si++)
{
deck.Add(FirstCut[0]);
FirstCut.RemoveAt(0);
}
}
if (deck.Count == 52)
{
NewDeck = deck;
}
}
deck.RemoveRange(0, 52);
ShuffledDeck = NewDeck;
}
return ShuffledDeck;
}
答案 0 :(得分:0)
当您将一个列表分配给另一个列表时,您没有复制它,您实际上是一遍又一遍地分配对同一列表的引用。所以,每次你这样做,他们都指向同一个地方。因此,清除一个清除所有。
你可能想要的是复制一份清单。例如:
NewDeck = new List<Card>(deck);
这不会复制卡片对象本身,但会创建一个引用卡片的新列表,这可能适合您的需要。