Ist es möglich, „foreach“ innerhalb einer Methode mit „yield“ zweimal oder öfter für dasselbe IEnumerable zu verwenden?C#

Ein Treffpunkt für C#-Programmierer
Guest
 Ist es möglich, „foreach“ innerhalb einer Methode mit „yield“ zweimal oder öfter für dasselbe IEnumerable zu verwenden?

Post by Guest »

Sehr einfacher Fall: Ich habe eine Liste von Elementen (1, 2, 3, 4, 5, 6, 7, 8, 9, 10). Ich muss es filtern und ein paar erste und ein paar letzte Elemente löschen und ein paar Elemente aus der Mitte erhalten (zum Beispiel muss ich (5, 6, 7, 8) erhalten).
Ich habe diese Methode geschrieben:

Code: Select all

IEnumerable GetCapturedTimeLapsesWithRatios(IEnumerable allTimeLapsesProfitabilitiesResult, int from, int to)
{
foreach (var item in allTimeLapsesProfitabilitiesResult)
{
if (item = to)
{
Console.WriteLine("if (item >= to) " + item);
yield return item;
yield break;
}
else
{
Console.WriteLine("else " + item);
yield return item;
break;
}
}
}

foreach (var item in allTimeLapsesProfitabilitiesResult)
{
if (item < to)
{
Console.WriteLine("if (item < to) " + item);
yield return item;
}
else
{
Console.WriteLine("else " + item);
yield return item;
yield break;
}
}
}

GetCapturedTimeLapsesWithRatios(new List() {0,1,2,3,4,5,6,7,8,9,10 }, 4, 8);
Und ich erhalte ein völlig falsches Ergebnis:

Code: Select all

{ 5, 0, 1, 2, 3, 4, 5, 6, 7, 8 }
und die Konsole zeigt mehr Zeilen an, als ich erwartet hatte

Code: Select all

0
1
2
3
4
else 5
if (item < to) 0    // wrong line
if (item < to) 1    // wrong line
if (item < to) 2    // wrong line
if (item < to) 3    // wrong line
if (item < to) 4    // wrong line
if (item < to) 5    // wrong line
if (item < to) 6
if (item < to) 7
else 8
Ich sehe, dass das zweite „foreach“ mit der Iteration ab dem „0“-Element begonnen hat, aber ich habe erwartet, dass es mit der Iteration ab dem „6“-Element beginnt, da das erste „foreach“ die ersten 5 verarbeitet hat.
Gibt es also eine Möglichkeit, „foreach“ mehrmals (jedes „foreach“ mit unterschiedlicher Filterung) auf demselben IEnumerable innerhalb einer Methode mit „yield“ zu verwenden? Oder mache ich es vielleicht falsch?
PS: Der obige Code ist ein Dummy, weil mein tatsächlicher Code komplexer ist, sodass ich nicht nur Standard-LINQ-Methoden wie verwenden kann

Code: Select all

new List() { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }
.SkipWhile(i => i  i  @from)“ „true“ zurückgibt, müssen Sie es nicht erneut überprüfen, da bis zum Ende der Schleife jedes Mal „true“ zurückgegeben wird, da die Eingabeliste aufsteigend sortiert ist. Um also keine unnötigen Zustandsauswertungen zu machen, führe ich verschiedene Zustandsauswertungen in zwei verschiedenen foreach durch, nicht in einem foreach.
[code]IEnumerable GetCapturedTimeLapsesWithRatios(IEnumerable input, DateOnly @from, DateOnly @to)
{
bool yielding = false;
IEnumerator e = input.GetEnumerator();
while (e.MoveNext())
{
if (e.Current > @from) yielding = true;
if (yielding) yield return e.Current;
if (e.Current > @to) yield break;
}
}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post