想要帮助/解释正在发生的事情.RemoveRange()

时间:2017-04-10 22:00:24

标签: c#

好的,所以我对编程很新,但是从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;
    }

1 个答案:

答案 0 :(得分:0)

当您将一个列表分配给另一个列表时,您没有复制它,您实际上是一遍又一遍地分配对同一列表的引用。所以,每次你这样做,他们都指向同一个地方。因此,清除一个清除所有。

你可能想要的是复制一份清单。例如:

NewDeck = new List<Card>(deck);

这不会复制卡片对象本身,但会创建一个引用卡片的新列表,这可能适合您的需要。