我正在尝试编写一个简单的纸牌游戏。为了提出一个好的改组算法,我遇到了Jeff Atwood在Coding Horror上的post

但是,当我在调用构造函数后查看对象的内容时,它们不会被随机播放。

这是我尝试使用Jeff解决方案的尝试:

class MainDeck : List<Card>
{
   public MainDeck()
    {
        this.Add(new Card(1, "Hearts"));
        this.Add(new Card(2, "Hearts"));
        this.Add(new Card(3, "Hearts"));
        ...

        this.OrderBy(a => Guid.NewGuid());
    }
}

这是Card的代码:
class Card
    {
        string suit;
        int value;

        public Card(int value, string suit)
        {
            this.value = value;
            this.suit = suit;
        }

        bool isFaceCard()
        {
            if (value >= 11 || value == 1)
                return true;
            else
                return false;
        }

        public override string ToString()
        {
            return (value +", " + suit);
        }
    }

为了改组工作,我应该改变什么?

最佳答案

LINQ方法不会突变现有的集合。因此,此语句完全不执行任何操作:this.OrderBy(a => Guid.NewGuid());另外,我很确定您不能将其分配给this,因此您必须不必从List<T>继承(这很好),或者执行以下操作:

var sorted = this.OrderBy(a => Guid.NewGuid()).ToList();
this.Clear();
this.AddRange(sorted);

还要看这个SO answer,还有更多正确的改组算法。

09-17 20:33