从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中甚至可以使用可选参数)达到效果,而要写这么多不同的方法呢?
这些缘由很多,我怕我说不到位,说的不对,这里也就不说了,能给大家带来一些思考就已经达到我要的目的了。
是想如果当年我写下那段舒尔特方格的代码,如果觉得写的很对,没有问题,这就是最好的写法,那么也就不会有当我看到随机排序时的恍然大悟。
带着问题去学习,向来都是最高效的。
我的博客原文地址:从LINQ的Count方法说起-3
欢迎来我的博客:nanqi.info
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?