Linq实践教程(1):一行代码实现DataTable全文搜索(Full Text Search)
2012-11-03 21:54
447 查看
话说某项目需要在客户端执行全文搜索,包括多条件和部分匹配。开发一个新功能首先得google,像这样的代码外国同行早就给我们准备好了,没想到竟然落空。Google不成就只能开发了,我一看有个实习的小伙,那就你了,开发这个功能,顺便练习一下Linq。他写了半天代码也没写出来,只好写了个传统的代码交差(见后面)。于是我就写了下面的代码:
public static List<DataRow> FullTextSearch(this DataTable dataTable, string[] keywords)
{
var q = dataTable.AsEnumerable().Where<DataRow>(row => keywords.All(keyword => row.ItemArray.Select(p => p.ToString()).Any<string>(s => s.Contains(keyword))));
return q.ToList();
}
例如 下面是出生婴儿的DataTable
现在我们要搜索2012年出生北京军区医院姓 "于"的小朋友,那搜索的关键字可以是:2012 军区 于
string[] keywords = new string[]{"2012", "军区", "于"};
dataTable.FullTextSearch(keywords);
搜索的结果如下:
有了这个扩展方法,我们就可以搜索各种各样的DataTable了,能满足基本的需求了。但这一句代码对于Linq的新手来说,其实还是挺长的,跟下面几个方法有关:
问题的关键在于All和Any,对于一条记录来说,所有的关键字是否包含在记录的任意项里了(条件)。总的来说,我们要从一个表里找出前面条件为真的记录。其实Linq也没有什么特别神奇的,只不过是把一些循环语句和条件语句封装成函数式。看习惯了有声明式编程的感觉,比命令式的风格更容易看懂,并且也更不容易出错。对比一下实习生写的代码:
public static List<DataRow> FullTextSearch(this DataTable dataTable, string keywords)
{
List<DataRow> row = new List<DataRow>();
DataTable dt = new DataTable();
string[] keywordToArray = keywords.Split(' ');
List<string> collectionID = new List<string>();
for (int i = 0; i < dataTable.Rows.Count; i++)
{
DataRow dr = dataTable.Rows[i];
int flag = 0;
foreach (var key in keywordToArray)
{
for (int j = 0; j < dr.ItemArray.Length; j++)
{
if (dr[j].ToString().Contains(key))
{
flag = flag + 1;
break;
}
}
}
if (flag == keywordToArray.Length)
row.Add(dataTable.Rows[i]);
}
return row;
}
public static List<DataRow> FullTextSearch(this DataTable dataTable, string[] keywords)
{
var q = dataTable.AsEnumerable().Where<DataRow>(row => keywords.All(keyword => row.ItemArray.Select(p => p.ToString()).Any<string>(s => s.Contains(keyword))));
return q.ToList();
}
例如 下面是出生婴儿的DataTable
序号 | 姓名 | 出生日期 | 性别 | 医院 |
1 | 李韦 | 2012-07-10 | 男 | 解放军总医院 |
2 | 云岚 | 2012-07-10 | 女 | 朝阳妇幼医院 |
3 | 周玲 | 2012-07-10 | 女 | 海淀医院 |
4 | 于晴 | 2012-08-10 | 女 | 北京军区总医院 |
5 | 王凌 | 2012-09-10 | 男 | 协和医院 |
6 | 张玉 | 2012-10-10 | 男 | 中日友好医院 |
string[] keywords = new string[]{"2012", "军区", "于"};
dataTable.FullTextSearch(keywords);
搜索的结果如下:
4 | 于晴 | 2012-08-10 | 女 | 北京军区总医院 |
名称 | 说明 | 举例 |
Where | 基于谓词筛选值序列。 | Where<DataRow>(row => ),从所有的记录里筛选满足All()条件的 |
All | 确定序列中的所有元素是否满足条件。 | keywords.All(keyword => ),所有的关键字都要满足下面的条件 |
Select | 将序列中的每个元素投影到新表中。 | row.ItemArray.Select(p => p.ToString()),把object[]转变为string[] |
Any | 确定序列中的任何元素是否都满足条件。 | Any<string>(s => s.Contains(keyword),string[]中的任何项包含关键字 |
public static List<DataRow> FullTextSearch(this DataTable dataTable, string keywords)
{
List<DataRow> row = new List<DataRow>();
DataTable dt = new DataTable();
string[] keywordToArray = keywords.Split(' ');
List<string> collectionID = new List<string>();
for (int i = 0; i < dataTable.Rows.Count; i++)
{
DataRow dr = dataTable.Rows[i];
int flag = 0;
foreach (var key in keywordToArray)
{
for (int j = 0; j < dr.ItemArray.Length; j++)
{
if (dr[j].ToString().Contains(key))
{
flag = flag + 1;
break;
}
}
}
if (flag == keywordToArray.Length)
row.Add(dataTable.Rows[i]);
}
return row;
}
相关文章推荐
- Linq实践系列(1):一行代码实现DataTable全文搜索(Full Text Search)
- flask入门的教程-全文搜索 Full Text Search
- MYSQ LFULLTEXT索引实现全文搜索
- 如何为Postgresql数据库全文搜索(full text search)编写解析器(parser)
- paip.mysql fulltext 全文搜索.最佳实践.
- paip.mysql fulltext 全文搜索.最佳实践.
- 纯代码实现 searchBar 并可以实时搜索
- Zend Search Lucene实现全文搜索
- PostgreSQL 8.3.1 全文检索(Full Text Search)
- mongoDB 全文搜索 TextSearch
- php 全文搜索和替换的实现代码
- SQL Server 2008 full-text search 全文检索的弱点(不支持后缀模糊查询)
- 使用ElasticSearch6.0快速实现全文搜索功能的示例代码
- jquery textSearch实现页面搜索 注意!!!!调用这个插件后,js事件绑定如,on、bind、live delegate全部失效,折腾了我一整天!!!
- 全文检索(full-text search)
- DotLucene:37行代码实现全文搜索
- 图片式教程:不写一行代码,实现 DropDownList 和 GridView 联动
- SQL Server 2008 Full-Text Search Overview(SQL Server 2008全文检索概览)
- php 全文搜索和替换的实现代码
- Detecting Oriented Text in Natural Images by Linking Segments:SegLink实现图像内文档识别的github代码复现实践笔记