C#为什么这些方法中的一些使用委托和泛型无法启动?

时间:2016-05-01 07:39:55

标签: c# .net generics methods delegates

我试图学习一些关于泛型和SelectMany函数和委托的知识。下面代码的语义功能(如函数应该做的那样)并不重要。他们中的大多数都没有做任何有意义的事情,只是试图查看函数的问题是否无法启动。

那是我的问题..为什么名为_SelectManyIteratora的方法无法启动。 _SelectManyIteratorb也没有。但_SelectManyIteratorc确实开始了。

在我调用函数时,我没有收到任何编译错误,函数的第一行,一个简单的WriteLine语句,没有执行!

我希望他们都能开始。

我的兴趣是

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Collections;


namespace functionwontstart
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] arrstr1 = { "abc", "def", "ghi" };
            string[] arrstr2= {"qrs","tuv","wxy"};

            _SelectManyIteratora(arrstr1, x => arrstr2, (s1, s2) => s1 + s2);
            _SelectManyIteratorb(arrstr1, x => arrstr2, (s1, s2) => s1 + s2);
           _SelectManyIteratorc(arrstr1, x => arrstr2);
            Console.ReadLine();
        }


        static IEnumerable<TResult> _SelectManyIteratora<TSource, TCollection, TResult>(IEnumerable<TSource> source, Func<TSource, IEnumerable<TCollection>> collectionSelector, Func<TSource, TCollection, TResult> resultSelector)
        {
            Console.Write("got this far"); // no!

            foreach (TSource element in source)
                foreach (TCollection subElement in collectionSelector(element))
                    yield return resultSelector(element, subElement);                
        }

        static IEnumerable<TResult> _SelectManyIteratorb<TSource, TCollection, TResult>(IEnumerable<TSource> source, Func<TSource, IEnumerable<TCollection>> collectionSelector, Func<TSource, TCollection, TResult> resultSelector)
        {
            Console.Write("got this far"); // no!

            TSource ts = source.ElementAt(0);
            TCollection tc = collectionSelector(ts).ElementAt(0);
            yield return resultSelector(ts, tc);
        }

        static IEnumerable<int> _SelectManyIteratorc<TSource, TCollection>(IEnumerable<TSource> source, Func<TSource, IEnumerable<TCollection>> collectionSelector)
        {
            Console.Write("got this far"); // yes

            return new List<int>();
        }

      } //class



} //namespace

1 个答案:

答案 0 :(得分:2)

这些方法是迭代器 - 它们使用yield return。它们以特殊的方式执行......代码仅在迭代结果时执行。

因此,如果您将调用代码更改为:

foreach (var item in _SelectManyIteratora) { }

然后你会看到正在执行的方法。在开始迭代返回值之前,方法中的所有代码都不会执行。每次代码命中yield return语句时,控件都会返回迭代它的代码,直到该代码要求下一个项目 - 此时它将跳回到方法中,之后yield return语句,所有局部变量都处于以前的状态。

更多详情: