【C#杂谈】当Grasshopper中的C# Scriptable电池遇到LinQ,抛弃Python的理由又多了一条

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

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接口(你能想到的所有的存储多个对象的存储结构都会遵循这个接口,比如ListArrayDictionaryStackQueue、……),都能直接使用Linq。

换句话说,无论哪都能用Linq,只要你想。

匿名函数

匿名函数又叫Lambda函数,语法为

评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值