Очень простой случай: у меня есть список элементов (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
Можно ли использовать foreach в одном и том же IEnumerable дважды или более внутри метода с выходом? ⇐ C#
Место общения программистов C#
1736373022
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;
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79337574/is-it-possible-to-use-foreach-on-the-same-ienumerable-twice-or-more-inside-a-m[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия