我在这里发现max
和min
来自日期,它应该同时考虑StartDate
和EndDate
并获取max
和min
从它的日期。请参阅下面的代码,使用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 :(得分: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。