【发布时间】:2016-05-13 23:08:58
【问题描述】:
我正在尝试使用 IEnumerator 来了解收益回报。在尝试了以下简单示例后,我发现链中的最后一个方法首先执行。这是我没想到的。
public static void Example()
{
List<Pet> pets =
new List<Pet>{ new Pet { Name="Barley", Age=8 },
new Pet { Name="Boots", Age=4 }
};
var p1 = pets.ReturnPetAgeGreatThan2().ReturnPetAgeGreatThan4();
foreach (var p in p1)
{
// Removed it to keep it simple
//Console.WriteLine("Pet Name:{0},Age:{1}", p.Name, p.Age);
}
Console.ReadLine();
}
public static IEnumerable<Pet> ReturnPetAgeGreatThan2(this IEnumerable<Pet> p)
{
Console.WriteLine("I am in ReturnPetAgeGreatThan2");
foreach (var par in p)
{
if (par.Age > 2)
yield return par;
}
}
public static IEnumerable<Pet> ReturnPetAgeGreatThan4(this IEnumerable<Pet> p)
{
Console.WriteLine("I am in ReturnPetAgeGreatThan4");
foreach (var par in p)
{
if (par.Age > 4)
yield return par;
}
}
}
输出
I am in ReturnPetAgeGreatThen4
I am in ReturnPetAgeGreatThen2
但是一旦我删除了yield return,并将函数更改为只使用return。方法是按顺序调用的。
public static IEnumerable<Pet> ReturnPetAgeGreatThan2(this IEnumerable<Pet> p)
{
Console.WriteLine("I am in ReturnPetAgeGreatThen2");
var result = p.Where(x => x.Age > 2);
return result;
}
public static IEnumerable<Pet> ReturnPetAgeGreatThan4(this IEnumerable<Pet> p)
{
Console.WriteLine("I am in ReturnPetAgeGreatThen4");
var result = p.Where(x => x.Age > 4);
return result;
}
输出
I am in ReturnPetAgeGreatThen2
I am in ReturnPetAgeGreatThen4
任何帮助理解这一点将不胜感激。
【问题讨论】:
标签: c# yield-return