第一次接触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 = ,
name = "test2_1",
value = "test2_1",
},
{
id = ,
name = "test2_2",
value = "test2_2",
},
{
id = ,
name = "test2_3",
value = "test2_3",
},
{
id = ,
name = "test2_4",
value = "test2_4",
},
{
id = ,
name = "test2_5",
value = "test2_5",
},
{
id = ,
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 %  ==  end)
for i, item in ipairs(temp) do
print(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 then
temp1[n] = item
end return item ~= nil
end) if all then
print(string.format("key1 {%s}", table.concat(Linq:Linq(GetAttributes(temp1)):Select(function(n) return string.format("%s:%s", n.k, n.v) end), ", ")))
else
print("key1 Error")
end local all = Linq:Linq(keys2):All(function(n)
local item = test3[n] if item then
temp1[n] = item
end return item ~= nil
end) if all then
print(string.format("key2 {%s}", table.concat(Linq:Linq(GetAttributes(temp1)):Select(function(n) return string.format("%s:%s", n.k, n.v) end), ", ")))
else
print("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只是一种处理列表数据的思想,使用这种数据处理列表会变得相对简单,只关心直接相关的业务逻辑即可。书写起来也比较方便。总之我比较喜欢这种方式。

相关的测试项目地址:http://git.oschina.net/anxin1225/LuaLinq

让Lua支持Linq吧的更多相关文章

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

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

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

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

  3. windows 下 gvim/vim lua支持问题,neocomplete等插件支持

    此文是按照知乎 https://www.zhihu.com/question/29333426 "windows下vim的lua支持问题?" 一文汇总的解决方案. 题主提供了不错的 ...

  4. LINQ to Entities 不支持 LINQ 表达式节点类型“Invoke”(笔记)

    今天使用使用动态查询的时候出现出现错误“LINQ to Entities 不支持 LINQ 表达式节点类型‘Invoke’.”,代码如下: IQueryable<CUSTOMER> que ...

  5. 为cocos2d-x项目增加Lua支持

    开始为游戏增加Lua脚本支持,今天主要配置了一下开发环境:cocos2d-x 2.2.1,xcode5. 1. 创建cocos2d-x-lua项目 类似于创建C++项目,用以下命令即可: python ...

  6. Nginx安装lua支持

    Nginx安装lua支持 需要LuaJIT-2.0.4.tar.gz,ngx_devel_kit,lua-nginx-module 1.下载安装LuaJIT-2.0.4.tar.gz wget -c ...

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

  8. Ubuntu中vim添加lua支持

    系统:Ubuntu 15.10/16.04 因为Ubuntu15.10系统自带vim不支持lua,所以得自己编译安装. $ sudo apt install vim-nox vim-nox可以让vim ...

  9. db4o发布7.2,出现.NET 3.5版本,支持LINQ

    db4o发布7.2,出现.NET 3.5版本,支持LINQ   Db4Object刚刚发布了db4o的7.2beta,除了以前支持如下的平台:.NET 1.1,.NET 2.0,Mono外,现在还支持 ...

随机推荐

  1. 《Django By Example》第一章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:本人目前在杭州某家互联网公司工作, ...

  2. Visual Studio 2012远程调试中遇到的问题

    有的时候开发环境没问题的代码在生产环境中会某些开发环境无法重现的问题,或者需要对生产环境代码进行远程调试该怎么办? Vs已经提供给开发者远程调试的工具 下面简单讲讲该怎么用,前期准备:1.本地登录账户 ...

  3. Android 剪贴板详解

    版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Clipboard 如本文有助于你理解 Android 剪贴板,不妨给我一个 Star.对于码农而言, ...

  4. linux应用调试技术之GDB和GDBServer

    1.调试原理 GDB调试是应用程序在开发板上运行,然后在PC机上对开发板上得应用程序进行调试,PC机运行GDB,开发板上运行GDBServer.在应用程序调试的时候,pc机上的gdb向开发板上的GDB ...

  5. 最好的.NET开源免费ZIP库DotNetZip(.NET组件介绍之三)

    在项目开发中,除了对数据的展示更多的就是对文件的相关操作,例如文件的创建和删除,以及文件的压缩和解压.文件压缩的好处有很多,主要就是在文件传输的方面,文件压缩的好处就不需要赘述,因为无论是开发者,还是 ...

  6. python enumerate 用法

    A new built-in function, enumerate() , will make certain loops a bit clearer. enumerate(thing) , whe ...

  7. js 入门级常见问题

    写在前面:以下是个人总结的关于js常见的入门级的问题一些总结. js是有 ECMAScript Dom Bom 三部分组成. 1,undefined,NaN,Null,infinity 1) unde ...

  8. 使用四元数解决万向节锁(Gimbal Lock)问题

    问题 使用四元数可以解决万向节锁的问题,但是我在实际使用中出现问题:我设计了一个程序,显示一个三维物体,用户可以输入绕zyx三个轴进行旋转的指令,物体进行相应的转动. 由于用户输入的是绕三个轴旋转的角 ...

  9. /etc/ppp/chap-secrets

    # Secrets for authentication using CHAP # client server secret IP addresses abc l2tpd * client:VPN 用 ...

  10. Xamarin.iOS开发初体验

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKwAAAA+CAIAAAA5/WfHAAAJrklEQVR4nO2c/VdTRxrH+wfdU84pW0