周末的时候弄了一下unity,感觉做一款3d游戏要了解的知识面设计太广,所以还是来学学语言的一些用法。
说起yield,C++的yield(函数,用于多线程)没用过,但是用过python的yield
,在C#和python中,这个关键字原理大概是配合着迭代器去使用以及实现的。
下面有两段杨辉三角的程序,分别用python和C#去实现,在C#的实现中需要继承一个IEnumerable(可枚举的)类,而python中只要在函数中使用yield
,就会使得这个函数对象成为一个生成器,C#中继承IEnumerable后需要实现GetEnumerator方法。
在python中,yield
可以搭配send
来做到协程,与似乎也打算看看C#是否有协程方法,百度了一下貌似都是使用Unity的协程,大概用法都是关于Unity的,不太了解是否可以把值传入迭代器中,在python中可以通过send
赋予迭代器的值,从而使得yield
可以返回值也可以接受值。
python版本:
def test():
res=[]
n=1
while(True):
tmp=[]
if n==1:
tmp=[1]
res.append(tmp)
n+=1
yield tmp
continue
for i in range(n):
if i==0 or i==n-1:
tmp.append(1)
else:
val=res[n-2][i-1]+res[n-2][i]
tmp.append(val)
res.append(tmp)
n+=1
yield tmp
n=0
res=[]
for r in test():
res.append(r)
n+=1
if n==10:
break
C#版本
class Test:IEnumerable
{
public IEnumerator GetEnumerator()
{
ArrayList res = new ArrayList();
int n = 1;
while (true)
{
ArrayList tmp = new ArrayList();
if (n == 1)
{
tmp.Add(1);
n++;
yield return tmp;
res.Add(tmp);
continue;
}
for(int i = 0; i < n; i++)
{
if (i == 0 || i == n - 1)
tmp.Add(1);
else
{
tmp.Add((int)((ArrayList)res[n - 2])[i - 1] + (int)((ArrayList)res[n - 2])[i]);
}
}
res.Add(tmp);
n++;
yield return tmp;
}
}
public static void Main()
{
Test a = new Test();
int n = 0;
foreach(ArrayList tmp in a){
foreach(int val in tmp)
{
Console.Write("{0} ", val);
}
Console.Write("\n");
n++;
if (n == 10)
break;
}
}
}