jth*_*h41 5 c# linq list playing-cards
我正在尝试写一个简单的纸牌游戏.为了提出一个好的改组算法,我遇到了Jeff Atwood 关于Coding Horror 的帖子.
但是,当我在调用构造函数后查看对象的内容时,它们不会被洗牌.
以下是我尝试使用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());
}
}
Run Code Online (Sandbox Code Playgroud)
这是卡的代码:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
我应该改变什么来改变洗牌工作?
Sar*_*sch 18
LINQ方法不会改变现有的集合.所以这个语句什么都不做:this.OrderBy(a => Guid.NewGuid());
另外,我很确定你不能分配this
,所以你必须要么不继承List<T>
(哪个好),要么做这样的事情:
var sorted = this.OrderBy(a => Guid.NewGuid()).ToList();
this.Clear();
this.AddRange(sorted);
Run Code Online (Sandbox Code Playgroud)
另外看看这个SO答案,还有更正确的改组算法.
使用此扩展方法
public static IEnumerable<T> Randomize<T>(this IEnumerable<T> source)
{
Random rnd = new Random();
return source.OrderBy<T, int>((item) => rnd.Next());
}
Run Code Online (Sandbox Code Playgroud)
试试这个
public void Shuffle()
{
Random r = new Random();
this.Sort((x, y) => r.Next(-1, 1));
}
Run Code Online (Sandbox Code Playgroud)
由于Linq的违约执行,以下行不会被执行.
this.OrderBy(a => Guid.NewGuid());
Run Code Online (Sandbox Code Playgroud)
这只是创建查询但从未执行过.即使执行它也不会改变你的收藏.
不要忘记Linq是一种查询数据的方法,而不是改变它.