2013-01-22 68 views
2

我試圖從日期列表中創建一組日期範圍。從日期列表創建日期範圍

這些日期存在於我的對象中。基本上我會遍歷每一行,並將繼續迭代,當時間跨度差異大於5分鐘時,我將停止並使用終點作爲日期範圍。我有一個算法之下,但問題是它排除了很多數據行:

請參閱樣本數據的下方,所需的輸出

**Sample Data** 

    Start_Date Start_Date_Time Replicate 
    12.12.2012 8:22:58   10 
    12.12.2012 8:22:58   30 
    12.12.2012 8:22:58   31 
    12.12.2012 8:22:58   32 
    12.12.2012 8:22:58   33 
    12.12.2012 8:22:58   34 
    12.14.2012 9:49:27   54 
    12.14.2012 9:49:27   55 
    12.14.2012 9:49:27   78 
    12.14.2012 9:49:27   99 
    12.14.2012 9:58    120 
    12.14.2012 9:58    140 
    12.14.2012 9:58    142 
    12/12/2012 9:59    144 
    12/12/2012 9:59    146 
    12/12/2012 9:59    148 
    12/12/2012 9:59    150 

**Desired Output** 
Date Ranges 
8:22:58-8:22:58 Replicate10-34 
9:49:27-9:49:27 Replicate54-99 
9:58-9:59   Replicate120-150 

我的代碼給我的結果,但它排除了許多行:

lf.ReplicateBlocks.OrderBy(x => x.InitiationDate); 

上面的initiationDate是StartDate和Start Time。我已經整理上面的列表中按升序從最小日期/時間啓動:

DateTime minimumDateTime = DateTime.MinValue; 

foreach (RunLog.Domain.Entities.ReplicateBlock rb in lf.ReplicateBlocks) 
{ 
    TimeSpan intervalMinutes = rb.InitiationDate.Subtract(minimumDateTime); 

    if (intervalMinutes.TotalMinutes >= 5) 
    { 
    minimumDateTime = rb.InitiationDate; 

    //minDates.Add(minimumDateTime); 

    UserConfirmationErrors confirmationRun = new UserConfirmationErrors(); 
    confirmationRun.minDate = rb.InitiationDate; 
    confirmationRun.replicateID = rb.ReplicateId; 

    uc.userConfirmationList.Add(confirmationRun); 
    } 
} 

List<RunLog.Domain.Entities.RunLogEntryDatesDisplay> reDisplay = new List<Domain.Entities.RunLogEntryDatesDisplay>(); 

foreach (var minDate in uc.userConfirmationList) 
{ 
    RunLog.Domain.Entities.RunLogEntryDatesDisplay red = new Domain.Entities.RunLogEntryDatesDisplay(); 
    reDisplay.Add(new Domain.Entities.RunLogEntryDatesDisplay() { runDate = minDate.minDate, DateRange = string.Format("{0} - {1}", minDate.minDate, minDate.minDate.AddMinutes(5)), MinimumReplicateId = minDate.replicateID.ToString() }); 
} 

//return reDisplay.OrderByDescending(t => t.runDate).ToList(); 
return reDisplay; 

一旦與日期範圍用戶確認列表形成,我將其發送到視圖中的複選框列表的形式,用戶選擇這些日期,我選擇日期,並再次查找下面的記錄:

var query = from d in selectedDates 
        from o in lf.ReplicateBlocks 
        where (d.Checked && 
          o.InitiationDate >= d.runDate && 
          o.InitiationDate <= d.runDate.AddMinutes(5)) 
        select o; 
+0

兩個日期點之間的時間跨度或開始日期點與當前迭代日期點之間的時間跨度? –

+0

它是開始日期點和當前迭代日期點之間的時間間隔。日期範圍形成後,下一個日期成爲新的開始日期點。 –

回答

1

我會整理這一點。首先創建一個班級來表示你的日期範圍。使用那裏的所有數據,您甚至可以覆蓋ToString()方法來輸出您需要的格式,例如

public class ReplicationDateRange 
{ 
    public DateTime StartDate { get; set; } 
    public DateTime EndDate { get; set; } 
    public int StartId { get; set; } 
    public int EndId { get; set; } 
    public override string ToString() 
    { 
     return String.Format("{0}-{1} Replicate {2}-{3}", StartDate.ToShortDateString(), EndDate.ToShortDateString(), StartId, EndId); 
    } 
} 

然後,你需要做的就是保持迭代列表,直到你打的日期是不是5分鐘,最後基線內,但也更新當前範圍的結束日期/ ID是什麼。以下應該達到此目的:

var dateRanges = new List<ReplicationDateRange>(); 
DateTime baselineDate = DateTime.MinValue; 
ReplicationDateRange currentDateRange = null; 
foreach (var block in lf.ReplicationBlocks.OrderBy(x => x.InitiationDate)) 
{ 
    if ((block.InitiationDate - baselineDate).TotalMinutes <= 5) 
    { 
     currentDateRange.EndDate = block.InitiationDate; 
     currentDateRange.EndId = block.ReplicateId; 
    } 
    else 
    { 
     baselineDate = block.InitiationDate; 
     currentDateRange = new ReplicationDateRange() 
     { 
      StartDate = block.InitiationDate, 
      EndDate = block.InitiationDate, 
      StartId = block.ReplicateId, 
      EndId = block.ReplicateId 
     }; 
     dateRanges.Add(currentDateRange); 
    } 
} 
foreach (var d in dateRanges) 
{ 
    Console.WriteLine(d); 
} 
+0

謝謝詹姆斯,我在試用你的解決方案。我會盡快發佈更新 –

+0

謝謝夥伴!它效果很好。 –