我正在尝试根据日期列表创建一组日期范围。
这些日期存在于我的对象中。基本上我会遍历每一行并继续迭代,当时间跨度差异大于 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;
形成带有日期范围的用户确认列表后,我将其以复选框列表的形式发送到 View ,用户选择这些日期,我选择这些日期并在下面再次查找这些记录:
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;
最佳答案
我会稍微整理一下。首先创建一个类来表示您的日期范围。有了所有数据,您甚至可以覆盖 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);
}
关于c# - 从日期列表创建日期范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14462985/