查找不连续日期时间列表,C#,LINQ
问题描述:
该算法是基于在一个DateTime列表中找到所述缺少的日期和分组日期的块,如果他们是第二开,或者具有其他的时间间隔查找不连续日期时间列表,C#,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中编写此代码。
答
如果我认为你其实只是想按日期组/次是第二相隔那么这是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;
});
能否请你说明,在细节,这是什么算法是为了做? – Enigmativity
行'var difference = datesList [1] - datesList [0];'在if(rnd.Next(1,5)== 4)继续跳过第二个值的情况下可能是错误的。 '线。 – Enigmativity
这行'difference = datesList [i + 1] - datesList [i];'只是多余的。 – Enigmativity