LinQ的全称Language Integrated Query,是一种将数据库理念,比如常用的查找(Select)、排序(Order By)、条件过滤(Where)等延伸到一般编程中的技术路径。
Grasshopper的日常使用其中也包含了大量数据传递/使用的过程,比如按一定规律生成一系列点、将一系列直线按某种条件过滤掉等。虽然Grasshopper自带的运算器可以实现这些功能,但是有时候需要拖入大量的电池来实现一个简单的过滤逻辑。比如要从一堆点里选出X坐标大于1且小于5的点,如果只使用Grasshopper自带的电池,就需要用到下列的电池组

这时候Python就能派上大用场了:使用Python电池,一行就搞定了
a = [pt for pt in x if pt.X > 1 and pt.X < 5]

虽然,C# Scriptable电池也能做得到这一点…… 但是这代码量可能就得多一点了
var list = new List<Point3d>();
foreach (var item in x)
if (item.X > 1 && item.X < 5)
list.Add(item);
A = list;

所以,很多时候,对于这类纯粹的数据操作(不涉及到几何运算、复杂对象操作)而言,Python往往获得了更多的人的青睐 —— 既能少写代码,又能让代码看起来更酷,列表生成式的逻辑表达也十分清楚。
反观C#的代码,foreach循环套一个if条件判断,代码量比Python多,看起来也平平无奇,没有亮点嘛。
但是,C#真的如此吗?
加上System.Linq命名空间,C#也能变得很酷:
using System.Linq;
// ... ...
A = x.Where(pt => pt.X > 1 && pt.X < 5);

下面是过滤处理100,000个数据点时,各个代码的效率对比,作为对照组,下面两个电池不做过滤,直接原路输出数据,作为对照。

Python的对照组居然比过滤后需要的时间更多?这是因为Python电池在运行时需要把来自Grasshopper内置的对象转换成为Python对象之后,才能在Python电池里处理,然后在输出时又要转回Grasshopper的对象,这需要对象被转换两次。因为过滤后的点的数量会变少,所以转换对象数量变少了,电池的运行时间就会变短。
Grasshopper本身就是C#写的,所以C# Scriptable电池在使用过程中不存在类似于Python一样的对象转换的过程,因此直接将点的列表原封不动地传出所需要的时间更少。
using System.Linq;
哪里能用Linq?
System.Linq命名空间里包含了对IEnumerable接口的一系列的扩展方法,只要对象遵循IEnumerable接口(你能想到的所有的存储多个对象的存储结构都会遵循这个接口,比如List、Array、Dictionary、Stack、Queue、……),都能直接使用Linq。
换句话说,无论哪都能用Linq,只要你想。
匿名函数
匿名函数又叫Lambda函数,语法为

本文介绍了LinQ技术,它将数据库理念延伸到一般编程。对比了Python和C#在处理数据操作时的表现,指出C#使用Linq可变得很酷。详细讲解了Linq的匿名函数、Select、Where、OrderBy等方法,还强调了Linq语法可连起来使用,让数据流逻辑更清晰。
最低0.47元/天 解锁文章
3792





