Linq高级应用
Linq的应用为我们带来了很大的方便,提高了coding效率,最近看到了一个用linq写的数独游戏算法,让我看到了Linq写的是如此优雅,耳目一新的感觉,以前没有写过这样的代码,同时也感觉到原来Linq如此强大,以前大部分使用的地方主要是在集合中使用.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace SingleNumber
{
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int[] source =
{
, , , , , , , , ,
, , , , , , , , ,
, , , , , , , , ,
, , , , , , , , ,
, , , , , , , , ,
, , , , , , , , ,
, , , , , , , , ,
, , , , , , , , ,
, , , , , , , ,
}; // http://www.sudoku.name/index-cn.php #10332 数独来自这个网站
int[] result = source.ToArray(); // result数组保存解算中间数据和结果
Func<bool> IsFinished = () => result.Where(x => x == ).Count() == ; // 判断是否解算完成
Func<int> NextNumber = () => result.Select((x, i) => new
{
x,
i
}).First(x => x.x == ).i; // 取下一个空格(这个算法不是唯一的,你也可以从后往前填写,或者别的方法)
Func<IEnumerable<int>> TryValues = () =>
{
int pos = NextNumber(); // 获取空格
int col = pos % ; // 行号
int row = pos / ; // 列号
int group = (row / ) * + col / ; // 宫号
var colnums = Enumerable.Range(, ).Except(Enumerable.Range(, ).Where(x => x % == col).Select(x => result[x]).Where(x => x != )); // 让1-9和本列已有数据对比,求差集,差集是对于列,允许填入的数字,下面类似
var rownums = Enumerable.Range(, ).Except(Enumerable.Range(, ).Where(x => x / == row).Select(x => result[x]).Where(x => x != ));
var groupnumbers = Enumerable.Range(, ).Except(Enumerable.Range(, ).Where(x => ((x / ) / ) * + (x % ) / == group).Select(x => result[x]).Where(x => x != ));
return colnums.Intersect(rownums).Intersect(groupnumbers); //数据是行、列、宫的交集
}; // 找出填写这个空格的所有可能尝试的数据 Action DisplayResult = () => Console.WriteLine(string.Join("\r\n", result.Select((x, i) => new
{
x,
i
}).GroupBy(x => x.i / ).Select(x => string.Join(" ", x.Select(y => y.x))))); // 显示结果
Action Solve = () =>
{
}; // 递归Lambda必须先定义一个空的。
Solve = () =>
{
if (IsFinished())
{
DisplayResult(); //如果全部填满,就输出结果(严格地,应该考虑无解的情况,这里忽略)
}
else
{
int pos = NextNumber(); // 获取空格位置
foreach (int item in TryValues()) // 依次尝试所有可能的数字
{
result[pos] = item; // 将盘面设置为尝试数字
Solve(); //下一层解算
}
result[pos] = ; // 尝试完还不行,恢复盘面,回溯上一层
}
}; // 算法主体
Solve(); // 开始解算
Console.Read();
}
}
}
}
代码注释的很详细,就不再解释了.欢迎爱好者一起讨论。
Linq高级应用的更多相关文章
- Webform(Linq高级查、分页、组合查询)
一.linq高级查 1.模糊查(包含) 1 public List<User> Select(string name) 2 { 3 return con.User.Where(r => ...
- LinQ高级查询、组合查询、IQueryable集合类型
LinQ高级查询: 1.模糊查询(包含) Repeater1.DataSource = con.car.Where(r =>r.name.Contains(s)).ToList(); 2.开头 ...
- Linq高级查询,分页查询及查询分页结合
一.高级查询与分页查询 1.以...开头 StartsWith Repeater1.DataSource=con.Users.Where(r=>r.Nickname.StartsWith( ...
- 2017年12月14日 LinQ高级查&&Asp.net WebForm Asp.net MVC
LinQ的高级查询用法 开头:StartsWith()结尾:EndsWith()模糊:Contains() 个数:Count最大值:Max(r => r.price)最小值:Min(r => ...
- LinQ 高级查询
高级查询 模糊查(包含):.Contains(name) 开头:.StartsWith(name) 结尾:.EndsWith(name) 个数:.Count() 最大值:Max(r => r.p ...
- LINQ高级编程 笔记
相关资料:http://www.cnblogs.com/lifepoem/archive/2011/12/16/2288017.html 1.什么是LINQ 语言集成查询是一系列标准查询操作符的集合, ...
- 【2017-06-02】Linq高级查询,实现分页组合查询。
1.以XXX开头 2.以XXX结尾 3.模糊查询 4.求个数 5.求最大值 6.求最小值 7.求平均值 8.求和 9.升序 10.降序 11.分页 Skip()跳过多少条 Take()取多少条 12. ...
- Linq 高级应用实例
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Tex ...
- LinQ高级查询
1.模糊查询 con.Users.Where(a =>a.UserName.Contains(name)).ToList(); //包含name con.Users.Where(a =>a ...
随机推荐
- java 爬虫
由于项目需求,综合了几种考虑方案,准备使用java 爬虫进行数据的获取,不用自己去费劲的想逻辑的实现 使用java爬虫之前,我们必须要掌握的知识: 1. 对前端HTML的元素有一定的认识 2. 使用h ...
- .net项目错误:找不到方法:“System.Net.Http.HttpClient stellar_dotnet_sdk.Server.get_HttpClient()
1.由于在项目里面引用了一个 新的项目stellar_dotnet_sdk,在 return new StellarWallet(ConvertToWalletSetting(coin)); 的 ...
- MVC之CodeFirst
1.建立MVC项目>NuGet安装EF 2.建立模型: public class Blog { [Key] [DatabaseGenerated(DatabaseGeneratedOption. ...
- 当前上下文中不存在viewbag
参考链接:http://www.cnblogs.com/chas/p/5076297.html view文件夹下的web.config中的appsetting节点中缺少了 <add key=&q ...
- jenkins配置slave节点 windows
1.在slave机器上,访问已安装的jenkins站点,如图,选择新建节点 配置节点 2.打开新建节点,如图,点击launch按钮下载slave-agent.jnlp文件,点击slave.jar下载该 ...
- Soa思想分布式服务webservice WCF
什么是分布式事务 分布式事务就是指事务的参与者.支持事务的服务器.资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上.以上是百度百科的解释,简单的说,就是一次大的操作由不同的小操作组成,这 ...
- c# 2016QQ自动登录程序
程序是抓QQ主程序窗体句柄,通过移位定位到QQ 输入框,虚拟键盘输入后,ALT切换到密码框的方式实现的 附程序: using System;using System.Collections.Gener ...
- 第一个ASP.NET Web API (C#)程序
本文翻自http://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api 绝对手工制作,如有雷同,实属巧合. 转载请注明. ...
- Luogu 2216[HAOI2007]理想的正方形 - 单调队列
Solution 二维单调队列, 这个数组套起来看得我眼瞎... Code #include<cstdio> #include<algorithm> #include<c ...
- 20172306《Java程序设计与数据结构》第九周学习总结
20172306<Java程序设计>第九周学习总结 教材学习内容总结 第十一章: try-catch语句.其中还有finally语句.try是进行某些操作,catch是捕获异常,并通过某些 ...