开发者

How to determine the earliest/latest DateTime in a collection?

开发者_运维知识库Question 1: In a collection of DateTime objects, how to determine which one is the earliest/latest?

Question 2: In a collection of objects, how to determine which object has the earliest/latest DateTime property?

For example:

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

Which VideoGame will be released first/last?

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)} );


Use the OrderBy and OrderByDescending functions of LINQ:

VideoGame first= allGames.OrderBy(x => x.ReleaseDate).FirstOrDefault();
VideoGame last = allGames.OrderByDescending(x => x.ReleaseDate).FirstOrDefault();
  • If allGames has zero items, both first and last will be null.
  • If allGames has 1 item, both items will reference that same item


Use Linq?

var min = allGames.Min(s => s.ReleaseDate);


var videoGame = allGames.OrderBy(x => x.ReleaseDate).FirstOrDefault(); earliest
var videoGame = allGames.OrderByDescending(x => x.ReleaseDate).FirstOrDefault(); latest


Question 1:

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

Or, if the collection is large and you don't want to iterate through it twice to get the min and 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;
}

Question 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);

Or, if the collection is large and you don't want to iterate through it twice to get the oldest and newest:

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;
}


You should use linq to to get tha latest one.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜