让Lua支持Linq吧
第一次接触Linq是在使用C#的时候,这种语法,在处理列表数据非常方便。如果想了解Linq的更多内容可以百度一下Linq,不过你不了解也没关系,让我在Lua中给你展示一下Linq的魅力。简单点说,Linq就是让忽略掉循环的部分,让你更加专业相关的业务实现。算是一种语法糖。
简单举几个例子
1、输出一个类中的所有内容
local test1 = {Attribute1 = "Attribute1",Attribute2 = "Attribute2",Attribute3 = "Attribute3", }print(string.format("{%s}", table.concat(Linq:Linq(GetAttributes(test1)):Select(function(n) return string.format("%s:%s", n.k, n.v) end), ", ")))
输出:
{Attribute2:Attribute2, Attribute1:Attribute1, Attribute3:Attribute3}
2、提取列表数据中的Id组装成一个新的Id列表
local test2 = {{id = 1,name = "test2_1",value = "test2_1",}, {id = 2,name = "test2_2",value = "test2_2",}, {id = 3,name = "test2_3",value = "test2_3",}, {id = 4,name = "test2_4",value = "test2_4",}, {id = 5,name = "test2_5",value = "test2_5",}, {id = 6,name = "test2_6",value = "test2_6",}, }print(table.concat(Linq:Linq(test2):Select(function(n) return n.id end), ", "))
输出:
1, 2, 3, 4, 5, 6
3、提取列表中id为单数的内容,组装成一个新的列表
local temp = Linq:Linq(test2):Where(function(n) return n.id % 2 == 1 end) for i, item in ipairs(temp) doprint(string.format("{%s}", table.concat(Linq:Linq(GetAttributes(item)):Select(function(n) return string.format("%s:%s", n.k, n.v) end), ", "))) end
输出:
{id:1, name:test2_1, value:test2_1} {id:3, name:test2_3, value:test2_3} {id:5, name:test2_5, value:test2_5}
4、从字典中组装一个table出来,如果所有的Key都存在则返回数据,否则则返回nil
local test3 = {key1 = "key1", key2 = "key2", key3 = "key3", key4 = "key4", }local keys1 = {"key1", "key2", "key3"} local keys2 = {"key1", "key2", "key5"} local temp1 = {} local all = Linq:Linq(keys1):All(function(n)local item = test3[n]if item thentemp1[n] = itemendreturn item ~= nil end)if all thenprint(string.format("key1 {%s}", table.concat(Linq:Linq(GetAttributes(temp1)):Select(function(n) return string.format("%s:%s", n.k, n.v) end), ", "))) elseprint("key1 Error") endlocal all = Linq:Linq(keys2):All(function(n)local item = test3[n]if item thentemp1[n] = itemendreturn item ~= nil end)if all thenprint(string.format("key2 {%s}", table.concat(Linq:Linq(GetAttributes(temp1)):Select(function(n) return string.format("%s:%s", n.k, n.v) end), ", "))) elseprint("key2 Error") end
输出:
key1 {key1:key1, key3:key3, key2:key2} key2 Error
综述
Linq的用处还有很多,需要你发挥想象力来使用它,这个地方我就不做过多的赘述了。下面我来简单的说明一下能够使用的方法。
能用的函数
Linq:Linq
传入一个列表类型的table,以后的操作都以列表类型为基础进行操作。方法内容会将传过来的对象Clone一份,不会破坏原来的数据。So放心大胆的用,虽然,Linq支持将列表类传递进来使用,但是我依然不推荐你这么用。
Select
这个函数会创建一个新的添加了Linq代码的列表。你在调用这个函数的时候需要传入一个函数,Linq会将列表中的每一项数据作为参数传入该函,这个函数的返回值会插入到新的列表中返回。简单点说。这个函数就是将原来的列表对象转换为新的列表对象的方法。
Where
筛选函数。调用该函数时,需要传入一个函数,Linq会吧列表中的数据,依次传入该函数,并将该函数的返回值作为bool值判定,是否将这一对象添加到新列表中并返回。
Sum
求和函数,调用该函数时,需要闯入一个函数,Linq会把了你报中的数据,依次传入该函数,并且将该函数的返回值累加起来返回。
All
判定函数,判定列表对象中所有的对象,是否都通过了校验。调用这个函数的时候,需要传入一个校验函数,Linq会将列表中的每一项传入校验函数,并且接受校验结果,如果任何一项判定失败,则直接返回失败,否则则返回成功。
Any
判定函数,判定列表对象中任何一个对象是否通过了校验。调用这个函数的时候,需要传入一个校验函数,Linq会将列表中的每一项以此传入校验函数,如果任何一项的校验结果判定成功,则直接返回成功,否则则返回失败。
First
获取函数,获取数据的第一项。调用这个函数时,可以传入一个校验函数,如果存在校验函数则以校验成功的第一项作为结果返回。
Get
获取函数,获取某一个具体对象的数据。此函数的针对对象不是列表,而是某一个校验对象。获取校验对象的名称属性。
Sort
排序函数,传入一个排序函数,这个函数接受两个值。该函数会将排好序的数据返回。
Clear
清理函数,清理数据中的Linq方法
疑问
1、使用Linq会不会破坏原来的数据?
不会,因为所有的数据都是从新Clone了一次,是操作Clone之后的数据,所以不会对原来的数据造成影响
2、使用Linq会不会降低性能?
会,但是影响应该不大。影响性能的主要因素主要有这么几个:1、Clone,确实会影响一些,不过为了数据安全,这样做还是很有必要的,再说使用Linq的时候一般是用来处理数据初始化,所以性能低一些也没什么关系;2、列表的循环,我想这个应该不能算作是主要原因,因为你要做列表处理,肯定要使用循环,都有循环,所以这个没什么关系;
最后
Linq只是一种处理列表数据的思想,使用这种数据处理列表会变得相对简单,只关心直接相关的业务逻辑即可。书写起来也比较方便。总之我比较喜欢这种方式。
转载于:https://www.cnblogs.com/xieweikai/p/6805898.html
让Lua支持Linq吧相关推荐
- LINQ to Entities 不支持 LINQ 表达式节点类型“ArrayIndex”
我就不屁话,能一张图就解决的就不说话了 2015-03-28 14:53:24,440 [10] ERROR log - System.NotSupportedException: LINQ to E ...
- AgileEAS.NET 4.0重构裁剪,新的ORM、支持Linq,正式支持WPF,开放更多的接口
很久没有和大家交流了,今天出来给大家汇报一下AgileEAS.NET平台的最新进展: AgileEAS.NET是一套企业级的快速开发平台或者说是中间件,主要服务于中小软件企业,以提高软件企业的有效生产 ...
- 11: Nginx安装lua支持
1.1 Nginx 使用lua脚本 注:需要LuaJIT-2.0.4.tar.gz,ngx_devel_kit,lua-nginx-module 1.Nginx安装lua支持 wget -c http ...
- 本人为巨杉数据库(开源NoSQL)写的C#驱动,支持Linq,全部开源,已提交github
一.关于NoSQL的项目需求 这些年在做AgileEAS.NET SOA 中间件平台的推广.技术咨询服务过程之中,特别是针对我们最熟悉的医疗行业应用之中,针对大数据分析,大并发性能的需求,我们也在慢慢 ...
- CentOS7下Nginx 安装 Lua 支持
Nginx 支持 Lua 需要安装 lua-nginx-module 模块,一般常用有 2 种方法: 1.编译 Nginx 的时候带上 lua-nginx-module 模块一起编译 2.使用 Ope ...
- Nginx安装配置Lua支持
Nginx安装配置Lua支持 1. 环境准备 2. 下载最新的`luajit`和`ngx_devel_kit`以及`lua-nginx-module`解压 3. 解压`ngx_devel_kit`以及 ...
- 如何让Snippet Compiler 2008 支持linq
转载自:http://www.cnblogs.com/hbb0b0/archive/2009/09/01/1557832.html 注意,下面的图和上面的图,有些不同 上面是在 FileSystem ...
- Go语言写的解析器(支持json,linq,sql,net,http等)
Monkey程序语言 Monkey v2.0版本已发布. monkey v2.0 增加了如下内容: 新增 short arrow(->)支持(类似C#的lambda表达式) 增加 列表推导和哈希 ...
- Lua党看过来|Cocos Creator 即将支持Lua!
廖大是Cocos2d-lua的老大,这是大家都晓得的.近日,廖大却不远千里飞来厦门,与Cocos Creator团队多位小鲜肉老腊肉整日厮混在一起,大门不出二门不迈,你知道为什么吗? 真相随着廖大今天 ...
最新文章
- 用ExayX在VS2019上输出文本有误的解决方案
- css3 box-shadow阴影(内外阴影与发光)讲解
- 【吼吼睡cocos2d学习笔记】第四章 - 第一个游戏
- 再好的代码没有电也跑不了
- 高数下部分公式及部分知识点整理
- IE浏览器为什么打不开java_IE浏览器拒绝访问的原因及其解决方法。
- 超级右键-Mac右键扩展工具
- 开源软件生态:现状与趋势
- win10屏幕亮度调节不见了,调节不了,解决办法
- vue table表格中身份证隐藏中间几位
- 计算机格式为gpt怎么更改,硬盘格式转换,手把手教你如何将硬盘mbr格式转换为gpt格式...
- 谷歌(Chrome)浏览器丨插件安装教程
- 连玉君链接-Stata连享会
- 高盐废水处理工艺——料液精制与除杂
- Figma#5:文字
- 【转】Java 多线程学习
- 大数据时代:大数据发展必备三个条件
- 南理文字RPG Four
- 微信投票服务器出现故障,微信投票安全隐患,微信存在安全隐患怎么解除
- 系统服务器日常巡检文档,服务器设备日常巡检指导书.pdf
热门文章
- 【Python4】字符分割识别,车牌识别矫正,移动物检测,Caffe_SSD三字码识别,ckpt文件转pb文件,人脸检测与识别
- 【物联网】OpenWrt编译和修改基础--预科
- [Qt教程] 第38篇 网络(八)TCP(二)
- 支持python开发的环境有哪些变化_Python开发实践:打造完美的项目工程环境
- Linux学习笔记 文件读写小细节
- Redis源码剖析(九)对象系统概述
- Rust中对某个结构体实现方法于rust中的关联函数
- C语言:函数中参数的传值与传地址
- 动态规划 - 买卖股票的最佳时机 IV
- java list 排序_Java中List的排序