2016-12-23 34 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可以为空,因此首先会过滤空的结束。