从不同的属性中查找最大和最小日期

时间:2016-12-23 11:03:15

标签: c# linq

我在这里发现maxmin来自日期,它应该同时考虑StartDateEndDate并获取maxmin从它的日期。请参阅下面的代码,使用LINQ是否有更好的方法。

public partial class Process
{
    public System.DateTime StartDate { get; set; }
    public Nullable<System.DateTime> EndDate { get; set; }
}


class Program
{
    static void Main(string[] args)
    {
        var processes = new List<Process>();

        var year = DateTime.Now.Year;
        var month = DateTime.Now.Month;

        processes.Add(new Process() { StartDate = new DateTime(year, month, 1),
                                      EndDate = new DateTime(year, month, 22) });
        processes.Add(new Process() { StartDate = new DateTime(year, month, 14),
                                      EndDate = new DateTime(year, month, 23) });
        processes.Add(new Process() { StartDate = new DateTime(year, month, 19),
                                      EndDate = new DateTime(year, month, 31) });
        processes.Add(new Process() { StartDate = new DateTime(year, month, 27),
                                      EndDate = new DateTime(year, month, 12) });
        processes.Add(new Process() { StartDate = new DateTime(year, month, 30),
                                      EndDate = new DateTime(year, month, 2) });

        var smax = processes.Max(p => p.StartDate) ;
        var emax = processes.Max(p => p.EndDate);

        var smin = processes.Min(p => p.StartDate);
        var emin = processes.Min(p => p.EndDate);

        var max = smax > emax ? smax : emax;
        var min = smin < emin ? smin : emin;

    }

4 个答案:

答案 0 :(得分:2)

  

使用linq有没有更好的方法呢?

是。像这样:

var max = processes.Max(p => p.StartDate > p.EndDate ? p.StartDate : p.EndDate);
var min = processes.Min(p => p.StartDate < p.EndDate ? p.StartDate : p.EndDate);

答案 1 :(得分:0)

没有必要为此目的使用linq。以下

var max = smax > emax ? smax : emax;

也可以写成:

var max = new DateTime(Math.Max(smax.Ticks, emax.Ticks)));

答案 2 :(得分:0)

是的,有。如果我们忽略否定时间的可能性,那么任何给定的开始日期都小于或等于相应的结束日期。这意味着min将是最小的开始日期,max将是最高的结束日期。

您不需要LINQ来确定它们:

class Program
{
    static void Main(string[] args)
    {
        var processes = new List<Process>();

        var year = DateTime.Now.Year;
        var month = DateTime.Now.Month;

        var myFirstDate = new Process() { StartDate = new DateTime(year, month, 1), EndDate = new DateTime(year, month, 22) };
        processes.Add(myFirstDate);
        processes.Add(new Process() { StartDate = new DateTime(year, month, 14), EndDate = new DateTime(year, month, 23) });
        processes.Add(new Process() { StartDate = new DateTime(year, month, 19), EndDate = new DateTime(year, month, 31) });
        processes.Add(new Process() { StartDate = new DateTime(year, month, 27), EndDate = new DateTime(year, month, 12) });
        var myLastDate = new Process() { StartDate = new DateTime(year, month, 30), EndDate = new DateTime(year, month, 2) };
        processes.Add(myLastDate);

        var max = myLastDate.EndDate;
        var min = myFirstDate.StartDate;

    }

答案 3 :(得分:0)

另一种方法是创建所有日期的列表,对它们进行排序并获得第一个和最后一个:

var dates = processes.Select(p=>p.StartDate).Concat(from p in processes let d= p.EndDate where d.HasValue select d.Value).OrderBy(d=>d).ToList();       
DateTime min = dates[0], max = dates[dates.Count - 1];

ToList是可选的,min和max可以直接使用,但这样排序只进行一次。

注意,由于EndDate可以为空,因此首先过滤掉空的enddates。