Использование лямбда-выражений для упорядочивания списка по дате по Гринвичу

У меня есть список, содержащий даты в формате GMT.

Каков наиболее элегантный способ гарантировать, что следующие лямбда-выражения упорядочены в поле даты как GMT?

ProductsList.OrderBy(Product => Product.Added).ToList(); 

person Nicholas Murray    schedule 05.02.2010    source источник
comment
Что вы имеете в виду под форматом GMT? Какой тип добавленного свойства?   -  person Jon Skeet    schedule 05.02.2010
comment
Время по Гринвичу. Добавлено поле DateTime, полученное из базы данных sql. Кстати, я знал, что этот вопрос был ловушкой для меда Джона Скита! РЖУ НЕ МОГУ ;->   -  person Nicholas Murray    schedule 05.02.2010
comment
Насколько актуален GMT? Содержит ли свойство Added даты для разных часовых поясов? Если все они находятся в одном часовом поясе, порядок не изменится, если вы просто отсортируете их по дате или если вы сначала конвертируете все даты в GMT. Думаю, я что-то здесь упускаю ...   -  person Fredrik Mörk    schedule 05.02.2010
comment
Привет, поле «Добавлено» - это поле DateTime, происходящее из базы данных и хранящееся как GMT, но я хотел бы убедиться, что позже он не будет отсортирован как строка. Но я полагаю, что если он сохранит свой тип как datetime при передаче в список, это гарантирует, что этого не произойдет.   -  person Nicholas Murray    schedule 05.02.2010
comment
Если ваше добавленное DateTime находится в GMT, у вас не должно быть проблем. Он будет отсортирован как строка, только если вы выполните Product.Added.ToString ().   -  person Carra    schedule 05.02.2010


Ответы (1)


Встроенные операторы LINQ используют ожидаемые операции сортировки (для LINQ-to-Objects он делает это с помощью Comparer<T>.Default. Ваше лямбда-выражение строго типизировано; за кулисами компилятор сделал для вас некоторые обобщения - на самом деле это:

var newList = Enumerable.OrderBy<Product,DateTime>(
         ProductsList, Product => Product.Added).ToList(); 

Он уже знает, что это DateTime, поэтому единственный раз, когда вам нужно сделать что-то дополнительное, это если ваши даты содержат диапазон разных часовых поясов. Конечно, в часовом поясе все должно быть в порядке, но вы можете (если бы вы были параноиком) преобразовать все в UTC - я не думаю, что вам нужно делать это в ваш случай, но:

var newList = ProductsList.OrderBy(
        Product => Product.Added.ToUniversalTime()).ToList();

Обратите внимание, что это фактически создает второй список (он не меняет порядок исходного списка); вы можете использовать код отсюда для сортировки на месте с использованием лямбда-выражений:

ProductsList.Sort(Product => Product.Added);
person Marc Gravell    schedule 05.02.2010