Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从日期列表创建日期范围_C# - Fatal编程技术网

C# 从日期列表创建日期范围

C# 从日期列表创建日期范围,c#,C#,我正在尝试从日期列表创建一组日期范围 这些日期出现在我的对象中。基本上,我会迭代每一行,并将继续迭代,当时间跨度差异大于5分钟时,我将停止并使用端点作为日期范围。我在下面有一个算法,但问题是它排除了许多数据行: 请参见下面的示例数据和所需输出 **Sample Data** Start_Date Start_Date_Time Replicate 12.12.2012 8:22:58 10 12.12.2012 8:22:58

我正在尝试从日期列表创建一组日期范围

这些日期出现在我的对象中。基本上,我会迭代每一行,并将继续迭代,当时间跨度差异大于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是开始日期和开始时间。我已将上述列表按升序排序,从最短日期/时间开始:

 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;
DateTime minimumDateTime=DateTime.MinValue;
foreach(lf.ReplicateBlocks中的RunLog.Domain.Entities.ReplicateBlock rb)
{
TimeSpan intervalMinutes=rb.InitiationDate.Subtract(最小日期时间);
如果(intervalMinutes.TotalMinutes>=5)
{
minimumDateTime=rb.InitiationDate;
//minDates.Add(minimumDateTime);
UserConfirmationErrors confirmationRun=新的UserConfirmationErrors();
confirmationRun.minDate=rb.InitiationDate;
确认run.replicateID=rb.replicateID;
uc.userConfirmationList.Add(confirmationRun);
}
}
列表重新显示=新列表();
foreach(uc.userConfirmationList中的var minDate)
{
RunLog.Domain.Entities.RunLogEntryDatesDisplay red=新域.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());
}
//返回reDisplay.OrderByDescending(t=>t.runDate.ToList();
回归再发现;
形成日期范围的用户确认列表后,我将其以复选框列表的形式发送到视图中,用户选择这些日期,我选择所选日期,并在下面再次查找这些记录:

  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;
var query=从选定日期中的d开始
从左复制块中的o开始
(d)在哪里检查&&
o、 启动日期>=d.runDate&&

o、 InitiationDate我会稍微整理一下。首先创建一个类来表示您的日期范围。使用其中的所有数据,您甚至可以重写
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);
}
var dateRanges=new List();
DateTime baselineDate=DateTime.MinValue;
ReplicationDataRange currentDateRange=null;
foreach(lf.ReplicationBlocks.OrderBy(x=>x.InitiationDate)中的var块)
{

如果((block.InitiationDate-baselineDate)两个日期点之间的.TotalMinutes timespan或开始日期点和当前迭代日期点之间的timespan?这是开始日期点和当前迭代日期点之间的timespan。形成日期范围后,下一个日期将成为新的开始日期点。谢谢James,我正在尝试您的解决方案。我将很快发布更新