Ich versuche, Ausbeute Rendite mit IEnumerator zu verstehen. Nachdem ich das folgende einfache Beispiel ausprobiert habe, habe ich festgestellt, dass die letzte Methode in der Kette zuerst ausgeführt wird. Was ich nicht erwartet hatte.Ertragsrückgabe ändert die Reihenfolge der verketteten Aufrufmethoden
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;
}
}
}
OutPut
I am in ReturnPetAgeGreatThen4
I am in ReturnPetAgeGreatThen2
Aber sobald ich yield return entfernen und die Funktion ändern, nur verwenden return.The Methoden in Reihenfolge aufgerufen werden.
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;
}
Ausgabe
I am in ReturnPetAgeGreatThen2
I am in ReturnPetAgeGreatThen4
Jede Hilfe, dies zu verstehen wird sehr geschätzt.