[英]Find max and min date from different property
在這里,我從日期中找到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;
}
是否有使用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.