Возможный выполнить итерации назад через foreach?

Значительная часть большинства методологий на самом деле определяет, как можно сотрудничать как команда. Значительная часть гибкого / экстремального программирования и т.д. о коммуникации, настраивая Вашу среду команды и больше того материала. Если Вы работаете одни, некоторые вещи легче, и некоторые вещи (пара, программирующая, например), более тверды.

Попытка, читающая на нескольких методологиях и методах выбора, что Вы думаете, что Вам нужно. Если Вы - индивидуальная команда, у Вас есть роскошь того, чтобы быть очень гибким. Так попытайтесь не бросить это только для следования за методологией, это предназначено, чтобы заставить многочисленные команды сотрудничать. Настолько только возьмите методы, что Вам действительно нужно. Утончается как TDD, и работающий в повторениях низко висящий плод. Просто продолжайте оценивать то, что Вы делаете и продолжаете улучшаться.

116
задан Peter Mortensen 14 April 2015 в 13:02
поделиться

5 ответов

При работе со списком (прямое индексирование) вы не можете сделать это так эффективно, как использование цикла for .

Edit: Что обычно означает, когда вы может использовать цикл для , вероятно, это правильный метод для этой задачи. Кроме того, поскольку foreach реализован по порядку, сама конструкция построена для выражения циклов, которые не зависят от индексов элементов и порядка итераций, что особенно важно в параллельном программировании . Я считаю, что итерация, основанная на порядке, не должна использовать foreach для цикла.

77
ответ дан 24 November 2019 в 02:14
поделиться

Как сказано в 280Z28, для IList вы можете просто использовать индекс. Вы можете скрыть это в методе расширения:

public static IEnumerable<T> FastReverse<T>(this IList<T> items)
{
    for (int i = items.Count-1; i >= 0; i--)
    {
        yield return items[i];
    }
}

Это будет быстрее, чем Enumerable.Reverse () , который сначала буферизует все данные. (Я не верю, что в Reverse применена какая-либо оптимизация, как в Count () .) Обратите внимание, что эта буферизация означает, что данные полностью считываются при первом запуске итерации, тогда как FastReverse «увидит» любые изменения, внесенные в список во время итерации. (Он также сломается, если вы удалите несколько элементов между итерациями.)

Для обычных последовательностей нет возможности выполнять итерацию в обратном порядке - последовательность может быть бесконечной, например:

50
ответ дан 24 November 2019 в 02:14
поделиться

Нет. ForEach просто перебирает коллекцию для каждого элемента, и порядок зависит от того, использует ли он IEnumerable или GetEnumerator ().

2
ответ дан 24 November 2019 в 02:14
поделиться

Если вы используете .NET 3.5, вы можете сделать это:

IEnumerable<int> enumerableThing = ...;
foreach (var x in enumerableThing.Reverse())

Это не очень эффективно, так как в основном он должен проходить через перечислитель вперед, помещая все в стек, а затем выталкивает все обратно в обратном порядке.

Если у вас есть непосредственно индексируемая коллекция (например, IList), вам определенно следует использовать вместо этого цикл for .

Если вы используете .NET 2.0 и не можете использовать цикл for цикл (т.е. у вас просто есть IEnumerable), тогда вам просто нужно будет написать свою собственную обратную функцию. Это должно сработать:

static IEnumerable<T> Reverse<T>(IEnumerable<T> input)
{
    return new Stack<T>(input);
}

Это зависит от некоторого поведения, которое, возможно, не так очевидно. Когда вы передаете IEnumerable конструктору стека, он будет перебирать его и помещать элементы в стек. Когда вы затем выполняете итерацию по стеку, он возвращает элементы обратно в обратном порядке.

Это и .NET 3.

137
ответ дан 24 November 2019 в 02:14
поделиться

Это работает очень хорошо

List<string> list = new List<string>();

list.Add("Hello");
list.Add("Who");
list.Add("Are");
list.Add("You");

foreach (String s in list)
{
    Console.WriteLine(list[list.Count - list.IndexOf(s) - 1]);
}
-8
ответ дан 24 November 2019 в 02:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: