在《LINQ 让数据操作更简单》一文中,我简单地介绍了 LINQ 是什么,以及它可以做什么。总的来说,LINQ 是一种更加方便地操作数据的技术,它可以以一种简单方便、统一的方式操作不同的数据源。
我们每天都要和数组、集合、XML、数据库、List、字符串类型的数据打交道。如果有一种通用、方便的方法来操作它们,将是一件非常有意义的事情。很高兴地告诉你, LINQ 就是这样的一种解决方案,这也是为什么我们要学习和掌握它。
在《LINQ 让数据操作更简单》一文中,我使用了基于 C# 语言的例子来简单介绍了 LINQ 的特性,让大家对 LINQ 有粗浅的认识。这一节,我将阐述怎么在 UiPath 中使用 LINQ。
从 C# 编程语言转换到 UiPath 并不复杂,但是需要注意一些细节才能成功。下面我将会举几个实用的例子来说明 LINQ 在UiPath 中的基本用法。
|LINQ 操作数组
数组是我们经常使用的数据类型,它能够被 LINQ 很好地处理。下面的例子中,让我们新建一个 int 类型的数组{2,12,5,15,16},然后通过 LINQ 筛选出小于 10 的元素。
在 C# 代码中,要实现这样的功能只需要 3 行代码,而且其中两行是变量声明,第 3 行才是操作数据的 LINQ。为了更加方便地做出对比,你可以在下面 Sequence 的 Annotation 中看到代码语句。
在 UiPath 中,只需要两个 Assign 就实现了同样的功能。注意这里的 For each 是为了查看结果用的,其实并不是操作数据的关键。操作数据的关键在于第 2 个 Assign 的右边,它填入的是 LINQ 语句:
在 Assign 右边的 LINQ 语句和在 C# 中的语句一模一样的。你还可以在输入框里对语句进行换行,提高代码可读性。这里并没有涉及复杂的 LINQ 语法,From 里面填写数据的来源,Where 后面紧跟过滤条件,Select 返回符合条件的值,这是 LINQ 最简单的形式。
由于这个例子中,填写的 过滤条件是 n < 10 , 它表示返回小于 10 的元素。毫无意外的,这个例子运行后返回了 2 和 5 这两个元素:
初次使用 LINQ,你也许会觉得它的语法跟 SQL 语句非常相似,但有所不同。是的,它跟 SQL 有很多相似的地方,微软在创造 LINQ 时参考了 SQL 的语法,为了更好地让 IDE 实现智能提示,LINQ 的 From 部分是在语句开始的位置,而 SQL 的 From 部分则在语句的后面。
你可以理解为 SQL 专注于数据库内的数据查询,而 LINQ 则可以查询数据库之外更多类型的数据源。确实是这样,LINQ 可以查询数据库,对象,XML ,DataSet。而这里讨论的数组查询则属于 LINQ to Object 的一小部分。LINQ 是一个非常庞大的技术栈,有专门的书籍介绍这门技术,本门涉及的只是冰山一角。
回到刚才的表达式,你也许会对表达式内的 n 感到疑惑。它的概念和 For Each 结构中的 item 一样,代表集合中的每一个元素。你可以将整个 LINQ 语句理解为,循环每个元素(From),让它和过滤条件比较(Where),返回符合条件的元素(Select)。
如果深入了解 LINQ 技术的原理,你会知道,.NET 实际上将 LINQ 语句编译成类似于 For Each 的循环来进行运算的。正因为这个原因,使用了 LINQ 之后,并不会使程序运算性能得到任何的提高。
那么,为什么要用 LINQ 而不直接使用 For Each 来解决问题呢?对比你会发现,使用 LINQ 后代码更加简单和简洁。LINQ 能够返回符合条件的集合,而 For Each Activity 要返回集合就没有那么简单了。
另外,LINQ 语句的 Select 部分还可以在返回之前对数据元素进行进一步的运算处理,这个简单的例子还没有深入探讨。
上面的例子中,还要注意的是第 2 个 Assign 接收 LINQ 返回值的变量类型。上面已经提到,LINQ 返回的是符合条件的元素集合。
这个集合必须是 IEnumerable 类型,在这个例子中更具体的是 IEnumerable <int>, int 是集合元素的数据类型。
接收到 LINQ 语句的返回之后,你就可以像使用数组、集合一样操作它了,这个例子中,我们使用 ForEach 结构提取出每个元素,然后用 WriteLine 把它打印出来了。
| LINQ 操作 List
数组类型更加适用于固定元素的系列,一旦创建之后无法增加和删除元素,在实际操作中,它并不方便我们对数据进行操作。而 List<T> 则能够动态添加和删除元素,还能实现数组的所有功能,因此深受开发人员的喜爱。
使用 LINQ 操作 List 类型的数据也很简单:
上述的例子能够实现和前面例子的同样功能,不同的是这次使用的是 List<int> 类型,初始化变量的方式不一样,而 LINQ 数据操作的语句是一模一样的。数据类型变了,语句还是一样的,这可以说是 LINQ 语句非常有意思的地方了。
数组的初始化是这样的:
而 List 的初始化是这样的:
| LINQ 操作 DataTable
在 UiPath 编程中,不可避免的会用到 DataTable。而结合 LINQ 之后,可以非常方便地对 DataTable 类型进行数据行的抽取,你不必每次都使用 ForEach Row Activity
假设对如下的数据表进行操作, 我们要抽取 STATUS 为 NG 的行:
使用 LINQ, 你可以这样做:
最终输出的结果是:
这个例子中,需要注意以下几点:
在抽取数据行的时候,要先将 DataTable 转换成 Enumerable 才能对使用 LINQ 操作
返回的类型是 IEnumerable<DataRow>
如果要将 IEnumerable<DataRow> 转换成 DataTable 类型,需要对返回结果调用 CopyToDataTable 方法
另外,LINQ 也有其它形式的的写法,以下是一个简单的例子,感兴趣的朋友可以自行查阅相关的资料。
这个例子中,对于数据表的操作只牵涉到其中一个过滤条件,你也可以直接使用 DataTable 的 Select 方法来实现同样的功能,巧合的是这个方法返回的也是 IEnumerable<datarow>类型。
相比于 LINQ 表达式,在这里它更加简洁,但是不能对符合条件的元素先处理后返回,而 LINQ 还可以在 Select 后面添加处理语句。
至于DataTable 的 Select 方法,我就不在这里深入探讨了,请自行查找相关的资料。在 UiPath 中,DataTable 非常重要而且常用,我后续也许会做专题总结和讲解。
<本文完>
更多 UiPath 相关的资讯,请关注本公众号:UiPath 教程
版权所有,如需转载,请先联系。
转发不属于转载行为,欢迎你转发到朋友圈、微信群,分享给微信朋友。
如需获取本文的源码,请在文章下方赞助一杯咖啡之后,在公众号后台留下你的邮箱地址。
网友评论