C# 为什么不是';将结果添加到列表时是否执行方法调用?
当使用C# 为什么不是';将结果添加到列表时是否执行方法调用?,c#,generics,ienumerable,iterable,C#,Generics,Ienumerable,Iterable,当使用res.Add(Repeat(item,nr))将Repeat(item,nr))添加到res时,不会执行Repeat方法 为什么??我使用了调试器,但它不执行它 public class Program { public static IEnumerable<IEnumerable<T>> Echo<T>(IEnumerable<T> src, int nr) { List<IEnumerable<
res.Add(Repeat(item,nr))
将Repeat(item,nr))
添加到res
时,不会执行Repeat
方法
为什么??我使用了调试器,但它不执行它
public class Program
{
public static IEnumerable<IEnumerable<T>> Echo<T>(IEnumerable<T> src, int nr)
{
List<IEnumerable<T>> res = new List<IEnumerable<T>>();
foreach (T item in src)
{
Console.Write(item);
res.Add(Repeat(item, nr));
}
return res;
}
static IEnumerable<T> Repeat<T>(T item, int nr)
{
for (int i = 0; i < nr; i++)
{
Console.Write(item);
yield return item;
}
}
public static void Main()
{
string[] src = { "a", "b", "c" };
Echo(src, 2);
}
}
公共类程序
{
公共静态IEnumerable回音(IEnumerable src,int nr)
{
List res=新列表();
foreach(src中的T项)
{
控制台。写入(项);
决议添加(重复(项目,编号));
}
返回res;
}
静态IEnumerable重复(T项,整数)
{
对于(int i=0;i
使用yield return
构建的枚举数在迭代之前不会执行。因此,您需要一些代码来迭代添加到列表中的枚举数。由于您从未对Echo返回的枚举数执行过任何操作(更不用说其中的项了),因此枚举数永远不会执行。迭代器方法就是这样工作的——它们生成IEnumerable
直到有人调用GetEnumerator
并使用它时才会执行任何操作<调用了code>Repeat,但实际命中的只是编译器生成的生成IEnumerable
实例的代码,而不是迭代器方法的主体——因此调试器不会显示正在运行的代码。请尝试将.ToList()添加到回显行:Echo(src,2).ToList()代码>@Neil,它只会枚举外部集合-列表中的集合仍然不会被枚举。您可以使用SelectMany().ToList()
枚举内部集合。