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);

上記の開始日は、開始日と開始時刻です。上記のリストを昇順で並べ替え、最小の日付/時刻から開始しました。

 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;
4

1 に答える 1

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);
}
于 2013-01-22T16:53:50.383 に答える