c# - 从日期列表创建日期范围

标签 c#

我正在尝试根据日期列表创建一组日期范围。

这些日期存在于我的对象中。基本上我会遍历每一行并继续迭代,当时间跨度差异大于 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/

相关文章:

c# - Microsoft Graph API for OneDrive 响应服务不可用

c# - 将字符串直接发送到打印机

c# - 将表格置于图像之上

c# - 将表达式树作为参数传递给另一个表达式树

c# - Int.TryParse() 总是返回 false

c# - 字符串未被识别为有效的 bool 值

c# - 如何在 C# 中向 google doc 表格单元格添加内容

c# - .Net Core Configuration.GetSection().Get<>() 没有绑定(bind)

c# - 捕获组嵌套如何影响组编号?

c# - 需要一些关于我的软件架构的建议。 [代码审查]