Как определить самый ранний / последний DateTime в коллекции? - PullRequest
8 голосов
/ 03 августа 2011

Вопрос 1: В коллекции объектов DateTime как определить, какой из них самый ранний / последний?

Вопрос 2: В коллекции объектовкак определить, какой объект имеет самое раннее / самое последнее свойство DateTime?

Например:

class VideoGame
{
    DateTime ReleaseDate { get; set; }
}

Какой VideoGame будет выпущен первым / последним?

var allGames = new List<VideoGame>();
allGames.Add( new VideoGame() { ReleaseDate = new DateTime(2010, 10, 4)} );
allGames.Add( new VideoGame() { ReleaseDate = new DateTime(2012, 7, 14)} );
allGames.Add( new VideoGame() { ReleaseDate = new DateTime(2014, 5, 26)} );

Ответы [ 5 ]

11 голосов
/ 03 августа 2011

Используйте функции OrderBy и OrderByDescending LINQ:

VideoGame first= allGames.OrderBy(x => x.ReleaseDate).FirstOrDefault();
VideoGame last = allGames.OrderByDescending(x => x.ReleaseDate).FirstOrDefault();
  • Если у allGames нет элементов, то первый и последний будут нулевыми.
  • Если у allGames есть 1 предмет, оба предмета будут ссылаться на тот же предмет
3 голосов
/ 03 августа 2011

Вопрос 1:

DateTime minDate = yourCollectionOfDateTimes.Min();
DateTime maxDate = yourCollectionOfDateTimes.Max();

Или, если коллекция большая, и вы не хотите повторять ее дважды, чтобы получить min и max:

DateTime? minDate = null, maxDate = null;
foreach (DateTime dt in yourCollectionOfDateTimes)
{
    if ((minDate == null) || (dt < minDate.Value))
        minDate = dt;

    if ((maxDate == null) || (dt > maxDate.Value))
        maxDate = dt;
}

Вопрос 2:

VideoGame oldest =
    allGames.Aggregate((a, x) => x.ReleaseDate < a.ReleaseDate ? x : a);

VideoGame newest =
    allGames.Aggregate((a, x) => x.ReleaseDate > a.ReleaseDate ? x : a);

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

VideoGame oldest = null, newest = null;
foreach (VideoGame vg in allGames)
{
    if ((oldest == null) || (vg.ReleaseDate < oldest.ReleaseDate))
        oldest = vg;

    if ((newest == null) || (vg.ReleaseDate > newest.ReleaseDate))
        newest = vg;
}
3 голосов
/ 03 августа 2011
var videoGame = allGames.OrderBy(x => x.ReleaseDate).FirstOrDefault(); earliest
var videoGame = allGames.OrderByDescending(x => x.ReleaseDate).FirstOrDefault(); latest
3 голосов
/ 03 августа 2011

Использовать Linq?

var min = allGames.Min(s => s.ReleaseDate);
0 голосов
/ 03 августа 2011

Вы должны использовать linq для получения последней версии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...