Я хочу добавить некоторые к данным ответам.
В случае, если вы столкнулись (или хотите использовать) троицу в ситуации, подобной «отобразить переменную, если она установлена, иначе ...», вы можете сделать ее еще короче, без троицы .
Вместо:
var welcomeMessage = 'Hello ' + (username ? username : 'guest');
Вы можете использовать:
var welcomeMessage = 'Hello ' + (username || 'guest');
Это Javascripts, эквивалентный сокращенному тройному оператору PHP ?:
Или даже:
var welcomeMessage = 'Hello ' + (username || something || maybethis || 'guest');
Он оценивает переменную, и если она ложная или не установлена, она переходит к следующей.
Короче говоря, он буферизует все, а затем проходит через это в обратном порядке. Неэффективно, но тогда и 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
Он работает, копируя базовый IEnumerable Если базовый IEnumerable
Для получения дополнительной информации см. System.Linq.Buffer
Изменить: базовая коллекция всегда копируется, даже если это ICollection
он загружает все элементы в память, а затем проходит по ним (назад). это гораздо менее эффективно.