不能不说的C#特性-迭代器(下),yield以及流的延迟计算
[1] 不能不说的C#特性-迭代器(下),yield以及流的延迟计算
[2] 不能不说的C#特性-迭代器(下),yield以及流的延迟计算
[3] 不能不说的C#特性-迭代器(下),yield以及流的延迟计算
[2] 不能不说的C#特性-迭代器(下),yield以及流的延迟计算
[3] 不能不说的C#特性-迭代器(下),yield以及流的延迟计算
系列文章导航:
不能不说的C#特性-迭代器(下),yield以及流的延迟计算
走进Linq-Linq to SQL How do I(1)
走进Linq-Linq to SQL How do I(2)
走进Linq-Linq to SQL How do I(3)
走进Linq-Linq to SQL源代码赏析 Table
走进Linq-Linq to SQL源代码赏析之Provider的初始化
走进Linq-Linq to SQL源代码赏析,通过Linq to SQL看Linq
题目:从0遍历到20(不包括20),输出遍历到的每个元素,并将大于2的所有数字放到一个IEnumerable中返回
解答1:(我以前经常这样做)
static IEnumerable<int> WithNoYield()
{
IList<int> list = new List<int>();
for (int i = 0; i < 20; i++)
{
Console.WriteLine(i.ToString());
if(i > 2)
list.Add(i);
}
return list;
}
{
IList<int> list = new List<int>();
for (int i = 0; i < 20; i++)
{
Console.WriteLine(i.ToString());
if(i > 2)
list.Add(i);
}
return list;
}
解答2:(自从有了C# 2.0我们还可以这样做)
static IEnumerable<int> WithYield()
{
for (int i = 0; i < 20; i++)
{
Console.WriteLine(i.ToString());
if(i > 2)
yield return i;
}
}
{
for (int i = 0; i < 20; i++)
{
Console.WriteLine(i.ToString());
if(i > 2)
yield return i;
}
}
如果我用下面这样的代码测试,会得到怎样的输出?
测试1:
测试WithNoYield()
static void Main()
{
WithNoYield();
Console.ReadLine();
}
{
WithNoYield();
Console.ReadLine();
}
测试WithYield()
static void Main()
{
WithYield();
Console.ReadLine();
}
{
WithYield();
Console.ReadLine();
}
测试2:
测试WithNoYield()
static void Main()
{
foreach (int i in WithNoYield())
{
Console.WriteLine(i.ToString());
}
Console.ReadLine();
}
{
foreach (int i in WithNoYield())
{
Console.WriteLine(i.ToString());
}
Console.ReadLine();
}
测试WithYield()
static void Main()
{
foreach (int i in WithYield())
{
Console.WriteLine(i.ToString());
}
Console.ReadLine();
}
{
foreach (int i in WithYield())
{
Console.WriteLine(i.ToString());
}
Console.ReadLine();
}
给你5分钟时间给出答案,不要上机运行