2016-08-22 8 views
-1

彼らは離れて二であるか、他の時間間隔を持っている場合、アルゴリズムは、日付のブロックをDateTimeのリストに欠けている日付を見つけ、グループ化に基づいています検索不連続、LINQ

DateTime startDate = DateTime.Now; 
Random rnd = new Random(); 
List<DateTime> datesList = new List<DateTime>(); 
List<List<DateTime>> segregatedList = new List<List<DateTime>>(); 
var oneYear = 60*60*24*365; 
///////////////////// INPUT GENERATE ///////////////////// 
for (var i = 0; i < oneYear; ++i) 
{ 
    if (rnd.Next(1, 5) == 4) continue; 
    datesList.Add(startDate.AddSeconds(i)); 
} 
/////////////////////// ALGORITHM /////////////////////// 
segregatedList.Add(new List<DateTime>()); 
var difference = datesList[1] - datesList[0]; 
var j = 0; 
var lastIndex = datesList.Count - 1; 


for (var i = 0; i < datesList.Count; ++i) 
{ 
    segregatedList[j].Add(datesList[i]); 

    if (i == lastIndex) continue; 
    if ((datesList[i + 1] - datesList[i]) == difference) 
    { 
     difference = datesList[i + 1] - datesList[i]; 
     continue; 
    } 
    segregatedList.Add(new List<DateTime>()); 
    ++j; 
} 

LINQにこのコードを書く能力があるのだろうかと思います。

+1

あなたは、このアルゴリズムはに何を意味するか、詳細に、説明していただけます行う? – Enigmativity

+0

2番目の値が 'if(rnd.Next(1、5)== 4)continueでスキップされた場合、' var difference = datesList [1] - datesList [0];行はおそらく間違っています。 '行。 – Enigmativity

+0

'difference = datesList [i + 1] - datesList [i];'行は冗長です。 – Enigmativity

答えて

0

私はあなたが実際にちょうど離れ秒です日付/時刻によってグループ化することを前提とした場合、これは、LINQのバージョンです:

DateTime startDate = DateTime.Now; 
Random rnd = new Random(); 
var oneYear = 60*60*24*365; 

List<DateTime> datesList = 
    Enumerable 
     .Range(0, oneYear) 
     .Where(i => rnd.Next(1, 5) != 4) 
     .Select(i => startDate.AddSeconds(i)) 
     .ToList(); 

List<List<DateTime>> segregatedList = 
    datesList 
     .Skip(1) 
     .Aggregate(
      datesList 
       .Take(1) 
       .Select(x => new List<DateTime>() { x }) 
       .ToList(), 
       (a, x) => 
       { 
        if (x.Subtract(a.Last().Last()) == TimeSpan.FromSeconds(1.0)) 
        { 
         a.Last().Add(x); 
        } 
        else 
        { 
         a.Add(new List<DateTime>() { x }); 
        } 
        return a; 
       });