繁体   English   中英

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

[英]Find max and min date from different property

在这里,我从日期中找到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;

    }

是否有使用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);

不需要为此使用linq。 下列

var max = smax > emax ? smax : emax;

也可以写成:

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

就在这里。 如果我们忽略负时间的可能性,则任何给定的开始日期都小于或等于相应的结束日期。 这意味着最小值将是最小的开始日期,最大值将是最高的结束日期。

您不需要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;

    }

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

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可为空,因此将首先滤除空的结束日期。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM