Как делает IEnumerable <T>.Reverse работа?

Я хочу добавить некоторые к данным ответам.

В случае, если вы столкнулись (или хотите использовать) троицу в ситуации, подобной «отобразить переменную, если она установлена, иначе ...», вы можете сделать ее еще короче, без троицы .


Вместо:

var welcomeMessage  = 'Hello ' + (username ? username : 'guest');

Вы можете использовать:

var welcomeMessage  = 'Hello ' + (username || 'guest');

Это Javascripts, эквивалентный сокращенному тройному оператору PHP ?:

Или даже:

var welcomeMessage  = 'Hello ' + (username || something || maybethis || 'guest');

Он оценивает переменную, и если она ложная или не установлена, она переходит к следующей.

21
задан GEOCHET 29 June 2009 в 14:18
поделиться

3 ответа

Короче говоря, он буферизует все, а затем проходит через это в обратном порядке. Неэффективно, но тогда и OrderBy с этой точки зрения.

В LINQ-to-Objects есть операции буферизации (Reverse, OrderBy, GroupBy и т. Д.) И операции без буферизации (Where, Take, Skip и т. Д.) .


В качестве примера реализации без буферизации Reverse с использованием IList , рассмотрим:

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

Обратите внимание, что это все еще немного подвержено ошибкам, если вы изменяете список во время итерации ... так что не делайте этого ;-p

43
ответ дан 29 November 2019 в 20:06
поделиться

Он работает, копируя базовый IEnumerable в массив, а затем перечисляя этот массив в обратном порядке. Если базовый IEnumerable реализует ICollection (например, T [], List и т. Д.), То этап копирования пропускается, и перечислитель просто выполняет итерацию по базовой коллекции напрямую.

Для получения дополнительной информации см. System.Linq.Buffer в Reflector.

Изменить: базовая коллекция всегда копируется, даже если это ICollection . Это предотвращает распространение изменений в базовой коллекции с помощью Buffer .

6
ответ дан 29 November 2019 в 20:06
поделиться

он загружает все элементы в память, а затем проходит по ним (назад). это гораздо менее эффективно.

3
ответ дан 29 November 2019 в 20:06
поделиться
Другие вопросы по тегам:

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