Published on

C Sharp in Grasshopper | 数据结构入门

Authors
  • avatar
    Name
    Jiaqi Wang(Ramis)
    Twitter

[ 最后更新 于 2025-3-9 21:08 ]

说明: 这是一篇不严肃的C Sharp入门笔记,主要是为了上班的我快速找到常用命令避免抓瞎。

另外: 上个星期二在Food4Rhino上发布了自己从去年八月起自己捣鼓出来的的第一个插件: https://www.food4rhino.com/en/app/pelicanflow

(是的, 虽然我捣鼓出了插件但是有的时候语法和函数还在抓虾。) (不过因为现在上班天天都要C#了!以后会是一个熟练工了吧!) (鹅仔成为半个码农的第一个星期!)


1. 数组和 List

1.1 初始化数组和 List

// 初始化 List
List<double> a = new List<double>() { 1.0, 2.0 };

// 初始化数组
double[] b = new double[] { 3.0, 4.0 };

// List 支持空集
List<double> a = new List<double>() {};

// 数组需要指定长度,且长度不可更改
double[] b = new double[2]; // 初始化时为 b = { 0.0, 0.0 }

1.2 Array与 List 的区别

Array数组的长度是固定的,初始化后无法更改; List更像一个动态的队列,长度可以变化,可以随时添加或删除元素。

例如: 1 在我们获取数组和 List 的长度时候调用的分别是Length和Count


int arrayLength = array.Length;  // 获取数组的长度 (固定大小) 
int listCount = list.Count;      // 获取 List 的元素个数 (可以动态变化)`

2 向 List 中添加元素我们可以直接


AA_array.Add(x); // 向 List 添加单个元素 
AA_array.AddRange(new List<double>{1,2,3,4}); // 向 List 添加另一个 List b

3 List和Array都可以直接修改地址

a[1] = 2;  // 修改数组元素

看一个简单例子:

List<double> a = new List<double>() { 1.0, 2.0 }; 
double[] b = new double[2];  // 将数组 b 合并到 List a 中 a.AddRange(b);`
a.AddRange(b);

此时合并后a的内容是:1.0, 2.0, 0.0, 0.0

2.DataTree 操作合集

2.1 创建 DataTree

DataTree<int> dt = new DataTree<int>();

2.2 创建DataTree树枝的地址

GH_Path gp2 = new GH_Path(new int[] { 300, 34, 1 });

2.3 向 DataTree 添加元素


dt.Add(y, new GH_Path(i));  // 简单地址

dt.Add(x, new GH_Path(new int[]{300,34,1}));  // 复杂地址

2.4 将List作为TreeBranch内容添加到DataTree

List<double> ds = new List<double>() {}; for (int i = 0; i < x; i++) {     ds.Add(i); } dt.AddRange(ds, new GH_Path(m));  // 将 List 添加到 DataTree 中`

2.5 简单双重循环建 DataTree

for (int i = 0; i < x; i++)
{     for (int j = 0; j < y; j++) 
{         int[] ipath = { i, j };         
dt.Add(k, new GH_Path(ipath));  // 根据生成的地址添加数据到 DataTree         
k++;     } }`

2.6 访问 DataTree 中的值并求和


DataTree<double> dt = new DataTree<double>(); 
double sum = 0;  
for (int i = 0; i < x.BranchCount; i++) 
{     
	int n = x.Branch(i).Count;     
for (int j = 0; j < n; j++) 
{    
	sum = sum + x.Branch(i)[j];     
	} 
}  
a = sum;

2.7 通过路径列表访问 DataTree 数据


private void RunScript(DataTree<double> x, double y, double z, ref object a) 
{     
DataTree<double> tree = new DataTree<double>();     
var pathlist = x.Paths;          
for (int i = 0; i < x.BranchCount; i++) 
{         
	var path = pathlist[i];         
	var currentBranch = x.Branch(i);         
	foreach (double r in currentBranch) 
	{             
		if (r > y && r < z) {                 
		tree.Add(r, path);  // 根据条件将数据添加到新树中,且不改变原地址             
	}         
	}     
}      
a = tree; }

2.8 获取所有分支的地址

private void RunScript(DataTree<double> x, ref object a) 
{     List<string> addresses = new List<string>() {};     
var adrs = x.Paths;          
for (int i = 0; i < adrs.Count; i++) 
{         
addresses.Add(adrs[i].ToString()); 
// 获取所有分支的路径地址     
}          
a = addresses; 
}

3. 随机函数

// 初始化随机种子
Random r = new Random();  
// 生成0到1之间的随机浮动数 
double q = r.NextDouble();  
// 生成1到9之间的随机整数(不包含10) 
int n = r.Next(1, 10);


Cat

每天写代码的上班工作强度还是很大的! 但是上周对自己的开发方向又有了很多新想法。 感觉人生变得好不一样!

-鹅仔 2025/03/09 21:10