前两篇博客导航:

##舒尔特方格


话说我曾经弄过WP应用,做了个很简单的一个游戏——舒尔特方格

舒尔特方格1 舒尔特方格2

(由于我实在找不到原图了,只能拿这个有水印的图片) 我要说的不是这个游戏,而是一个简单的不能再简单的问题——如何把25各数字随机排列在方格中
我曾写过的一个实现方式:

List<int> lst = new List<int>();

for (int i = 1; i <= 25; i++)
{
    lst.Add(i);
}

foreach (Button btn in Schulte_Grid.Children)
{
    btn.Content = lst[ran.Next(lst.Count)].ToString();
    lst.Remove(index);
}

当然,我现在找到更合适的方法:

List<int> lst = Enumerable.Range(1, 25).OrderBy(i => Guid.NewGuid()).ToList();
Button btn;
for (int i = 0; i < Schulte_Grid.Children.Count; i++)
{
    btn = Schulte_Grid.Children[i];
    btn.Content = lst[i].ToString();
}

##关于OrderBy


我在想,这个问题中,我从思想上就已经错了。
我一直在想,如何从一个集合中随机取出,而不是想着如何把一个集合随机排列,然后依次取出。
关于OrderBy方法,某些人不理解为什么返回值是一个泛型,也就是说返回什么都可以,所以经常见到的写法是:

lst.OrderBy(i => i);

关于排序问题,必然涉及比较器,请参见关于ListView排序的众多问题,这里就不再啰嗦了。

OrderBy本来是没什么好说的,但是如果用TSQL或查询表达式来想,如果对多字段排序应该怎么写?如果是降序排列呢?
如果你试着想从OrderBy中实现这些,不是不行,不是说了有比较器么,但是这就又犯了在一棵树上吊死的错误了。
在LINQ方法中,对于多字段排序有ThenBy方法,对于降序排序有OrderByDescending,对于降序多字段排序有ThenByDescending
这就让人思考,为什么不在OrderBy方法中多传几个参数,或多加几个重载(在4.0中甚至可以使用可选参数)达到效果,而要写这么多不同的方法呢?

这些缘由很多,我怕我说不到位,说的不对,这里也就不说了,能给大家带来一些思考就已经达到我要的目的了。
是想如果当年我写下那段舒尔特方格的代码,如果觉得写的很对,没有问题,这就是最好的写法,那么也就不会有当我看到随机排序时的恍然大悟。
带着问题去学习,向来都是最高效的。



blog comments powered by Disqus

Published

2012-12-23

Tags