這是測試數據。我在列表末尾添加了10月6日,以確保結果只會選取最後連續的日期集。
List<DateTime> viewDates = new List<DateTime>();
viewDates.Add(new DateTime(10, 10, 1));
viewDates.Add(new DateTime(10, 10, 3));
viewDates.Add(new DateTime(10, 10, 3));
viewDates.Add(new DateTime(10, 10, 4));
viewDates.Add(new DateTime(10, 10, 5));
viewDates.Add(new DateTime(10, 10, 5));
viewDates.Add(new DateTime(10, 10, 5));
viewDates.Add(new DateTime(10, 10, 6));
首先,我們需要找出最後連續日期:
var lastConsecutiveDate = viewDates
.Distinct()
.Reverse()
.SkipWhile(distinctDate => viewDates.Where(viewDate => (viewDate.Date == distinctDate.Date)).Count() < 2).FirstOrDefault();
我們有兩個選擇這裏,使用foreach
或LINQ
?與LINQ
相比,foreach
更具可讀性。我將顯示兩個實現。
這是foreach
實現:
var consecutiveDates = new List<DateTime>();
foreach (var item in viewDates.Where(viewDate => viewDate <= lastConsecutiveDate).Distinct().OrderByDescending(a => a.Date))
{
//break if datediff is not 1
int count = consecutiveDates.Count;
if ((count > 0) && (consecutiveDates[count - 1].Date.AddDays(-1) != item.Date))
{
break;
}
consecutiveDates.Add(item);
}
這是LINQ
的實施,以下可讀:
var consecutiveDates = viewDates
.Where(viewDate => viewDate <= lastConsecutiveDate)
.Distinct()
.OrderByDescending(viewDate => viewDate.Date)
.Aggregate
(
new { List = new List<DateTime>() },
(result, viewDate) =>
{
int count = result.List.Count;
if ((count > 0) && (result.List[count - 1].Date.AddDays(-1) != viewDate.Date))
{
return new { result.List };
}
result.List.Add(viewDate);
return new { result.List };
},
a => a.List
);
Console.WriteLine(consecutiveDates.Count());
將打印出 「3」。 我期待更多的代碼重構,但我休息了。
來源
2010-10-10 09:59:44
bla
難道你不想返回7不是3? – codingbadger 2010-10-10 09:53:01
我明顯在連續幾天之後,連續幾天沒有多少記錄。 – ajbeaven 2010-10-10 10:01:33
啊是的 - 抱歉,我誤解了你的問題。 – codingbadger 2010-10-10 10:02:42