我试图学习一些关于泛型和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
答案 0 :(得分:2)
这些方法是迭代器 - 它们使用yield return
。它们以特殊的方式执行......代码仅在迭代结果时执行。
因此,如果您将调用代码更改为:
foreach (var item in _SelectManyIteratora) { }
然后你会看到正在执行的方法。在开始迭代返回值之前,方法中的所有代码都不会执行。每次代码命中yield return
语句时,控件都会返回迭代它的代码,直到该代码要求下一个项目 - 此时它将跳回到方法中,之后yield return
语句,所有局部变量都处于以前的状态。
更多详情: