私は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
しかし、すぐに私は降伏リターンを削除し、使用する機能を変更すると、単にメソッドが順序で呼び出されreturn.The。
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
これを理解するすべてのヘルプははるかに高く評価されます。