从LINQ的Count方法说起-3
前两篇博客导航:
##舒尔特方格
话说我曾经弄过WP应用,做了个很简单的一个游戏——舒尔特方格:
(由于我实在找不到原图了,只能拿这个有水印的图片)
我要说的不是这个游戏,而是一个简单的不能再简单的问题——如何把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