C# yield

  周末的时候弄了一下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;
            }
        }
    }

你可能感兴趣的:(C#)