2016-12-23 76 views
0

此處查找最大值和最小值日我從日期查找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; 

    } 
+0

嘗試'Math.Min'和'Math.Max',但它不處理'DateTime'。請參閱https://msdn.microsoft.com/en-us/library/system.math.min(v=vs.110).aspx – Stefan

+0

使用框架使用的類名稱不是一個好主意,例如' Process'。現在可能會好起來,但可能會回來咬你。 – HebeleHododo

+0

我認爲你需要的不僅僅是最大分鐘數,就像一個擴展來查找日期是否重疊,如果日期是有效的(例如,開始日期更少棕褐色endate等),然後在單個linq中獲得最大值。你可以從[[link(] http://blog.reneorban.com/2013/01/generic-method-to-check-if-dates-or.html)]([link(] http:/ /blog.reneorban.com/2013/01/generic-method-to-check-if-dates-or.html)),並且恰到好處地將自己的最小值放在最上面 –

回答

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); 
+0

這個句柄是否爲空 –

+0

@ManiothShijith您的代碼處理空?你剛纔問*有沒有更好的方法使用linq *來做這件事,我提出了一個解決方案。 –

0

爲此目的沒有任何需要使用linq。下面

var max = smax > emax ? smax : emax; 

可以寫也爲:

var max = new DateTime(Math.Max(smax.Ticks, emax.Ticks))); 
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; 

    } 
+0

訂單可以更改,它將是動態的。 –

+0

@ManiothShijith在這種情況下,您可以選擇最小的StartDate和最大的EndDate。 –

+0

日期可能會重疊。它可以是一個記錄的Endtime可能小於下一個記錄的開始時間。 –

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是可選的,最小值和最大值可以直接使用,但這種方式只能進行一次。

注意,由於EndDate可以爲空,因此首先會過濾空的結束。