gpt4 book ai didi

C# 为什么其中一些使用委托(delegate)和泛型的方法没有启动?

转载 作者:行者123 更新时间:2023-11-30 23:26:11 25 4
gpt4 key购买 nike

我试图学习一些关于泛型和 SelectMany 函数和委托(delegate)的知识。下面代码的语义功能(如功能应该做什么)无关紧要。他们中的大多数没有做任何有意义的事情,只是试图查看函数未启动的问题是否仍然存在。

这是我的问题.. 为什么名为 _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

最佳答案

这些方法是迭代器 - 它们使用yield return。它们以一种特殊的方式执行……代码只会在您迭代结果时执行。

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

foreach (var item in _SelectManyIteratora) { }

然后您将看到正在执行的方法。在您开始迭代返回值之前,方法中的任何代码都不会执行。每次代码遇到 yield return 语句时,控制权将返回到对其进行迭代的代码,直到该代码请求下一个项目 - 此时它将跳回到方法中,就在之后yield return 语句,所有局部变量都处于与之前相同的状态。

更多详情:

关于C# 为什么其中一些使用委托(delegate)和泛型的方法没有启动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36964275/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com