簡體   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