Можно ли использовать foreach в одном и том же IEnumerable дважды или более внутри метода с выходом?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Можно ли использовать foreach в одном и том же IEnumerable дважды или более внутри метода с выходом?

Сообщение Anonymous »

Очень простой случай: у меня есть список элементов (1, 2, 3, 4, 5, 6, 7, 8, 9, 10). Мне нужно отфильтровать его и удалить несколько первых элементов и несколько последних элементов, а также получить несколько элементов из середины (например, мне нужно получить (5, 6, 7, 8)).
Я написал этот метод:
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);

И я получаю совершенно неверный результат:
{ 5, 0, 1, 2, 3, 4, 5, 6, 7, 8 }

и консоль отображает больше строк, чем я ожидал
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

Я вижу, что второй foreach начал итерацию с элемента "0", но я ожидал, что он начнет итерацию с элемента "6", потому что первый foreach обработал первые 5.
Итак, есть ли способ использовать foreach несколько раз (каждый foreach с разной фильтрацией) в одном и том же IEnumerable внутри метода с доходностью? Или, может быть, я делаю это неправильно?
PS: приведенный выше код — пустышка, потому что мой реальный код более сложен, поэтому я не могу использовать только стандартные методы LINQ, такие как
new List() { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }
.SkipWhile(i => i i @from)», возвращающего true, вам не нужно будет проверять его снова, потому что он будет возвращать true каждый раз до конца цикла, поскольку список входных данных упорядочен по возрастанию. Поэтому, чтобы не делать ненужных оценок условий, я выполняю разные оценки условий в двух разных операциях foreach, а не в одной операции foreach.
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;
}
}


Подробнее здесь: https://stackoverflow.com/questions/793 ... inside-a-m
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»