第一次接触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吧相关推荐

  1. LINQ to Entities 不支持 LINQ 表达式节点类型“ArrayIndex”

    我就不屁话,能一张图就解决的就不说话了 2015-03-28 14:53:24,440 [10] ERROR log - System.NotSupportedException: LINQ to E ...

  2. AgileEAS.NET 4.0重构裁剪,新的ORM、支持Linq,正式支持WPF,开放更多的接口

    很久没有和大家交流了,今天出来给大家汇报一下AgileEAS.NET平台的最新进展: AgileEAS.NET是一套企业级的快速开发平台或者说是中间件,主要服务于中小软件企业,以提高软件企业的有效生产 ...

  3. 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 ...

  4. 本人为巨杉数据库(开源NoSQL)写的C#驱动,支持Linq,全部开源,已提交github

    一.关于NoSQL的项目需求 这些年在做AgileEAS.NET SOA 中间件平台的推广.技术咨询服务过程之中,特别是针对我们最熟悉的医疗行业应用之中,针对大数据分析,大并发性能的需求,我们也在慢慢 ...

  5. CentOS7下Nginx 安装 Lua 支持

    Nginx 支持 Lua 需要安装 lua-nginx-module 模块,一般常用有 2 种方法: 1.编译 Nginx 的时候带上 lua-nginx-module 模块一起编译 2.使用 Ope ...

  6. Nginx安装配置Lua支持

    Nginx安装配置Lua支持 1. 环境准备 2. 下载最新的`luajit`和`ngx_devel_kit`以及`lua-nginx-module`解压 3. 解压`ngx_devel_kit`以及 ...

  7. 如何让Snippet Compiler 2008 支持linq

    转载自:http://www.cnblogs.com/hbb0b0/archive/2009/09/01/1557832.html 注意,下面的图和上面的图,有些不同  上面是在 FileSystem ...

  8. Go语言写的解析器(支持json,linq,sql,net,http等)

    Monkey程序语言 Monkey v2.0版本已发布. monkey v2.0 增加了如下内容: 新增 short arrow(->)支持(类似C#的lambda表达式) 增加 列表推导和哈希 ...

  9. Lua党看过来|Cocos Creator 即将支持Lua!

    廖大是Cocos2d-lua的老大,这是大家都晓得的.近日,廖大却不远千里飞来厦门,与Cocos Creator团队多位小鲜肉老腊肉整日厮混在一起,大门不出二门不迈,你知道为什么吗? 真相随着廖大今天 ...

最新文章

  1. 用ExayX在VS2019上输出文本有误的解决方案
  2. css3 box-shadow阴影(内外阴影与发光)讲解
  3. 【吼吼睡cocos2d学习笔记】第四章 - 第一个游戏
  4. 再好的代码没有电也跑不了
  5. 高数下部分公式及部分知识点整理
  6. IE浏览器为什么打不开java_IE浏览器拒绝访问的原因及其解决方法。
  7. 超级右键-Mac右键扩展工具
  8. 开源软件生态:现状与趋势
  9. win10屏幕亮度调节不见了,调节不了,解决办法
  10. vue table表格中身份证隐藏中间几位
  11. 计算机格式为gpt怎么更改,硬盘格式转换,手把手教你如何将硬盘mbr格式转换为gpt格式...
  12. 谷歌(Chrome)浏览器丨插件安装教程
  13. 连玉君链接-Stata连享会
  14. 高盐废水处理工艺——料液精制与除杂
  15. Figma#5:文字
  16. 【转】Java 多线程学习
  17. 大数据时代:大数据发展必备三个条件
  18. 南理文字RPG Four
  19. 微信投票服务器出现故障,微信投票安全隐患,微信存在安全隐患怎么解除
  20. 系统服务器日常巡检文档,服务器设备日常巡检指导书.pdf

热门文章

  1. 【Python4】字符分割识别,车牌识别矫正,移动物检测,Caffe_SSD三字码识别,ckpt文件转pb文件,人脸检测与识别
  2. 【物联网】OpenWrt编译和修改基础--预科
  3. [Qt教程] 第38篇 网络(八)TCP(二)
  4. 支持python开发的环境有哪些变化_Python开发实践:打造完美的项目工程环境
  5. Linux学习笔记 文件读写小细节
  6. Redis源码剖析(九)对象系统概述
  7. Rust中对某个结构体实现方法于rust中的关联函数
  8. C语言:函数中参数的传值与传地址
  9. 动态规划 - 买卖股票的最佳时机 IV
  10. java list 排序_Java中List的排序