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);
Code: Select all
{ 5, 0, 1, 2, 3, 4, 5, 6, 7, 8 }
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
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;
}
}