我有個約會週期名單和那些期限不重疊結合連續日期期間
|StartDate| EndDate|
| null | 1/12 |
| 2/12 | null |
| null | 4/12 |
| 6/12 | 8/12 |
| 9/12 | null |
| null | 10/12 |
| 11/12 | null |
我有那些時間段相結合,顯示如下列表:
|StartDate| EndDate|
| null | 1/12 |
| 2/12 | 4/12 |
| 6/12 | 8/12 |
| 9/12 | 10/12 |
| 11/12 | null |
這裏是我的解決方案,但我認爲這不是一個聰明的辦法
var dateList = periodList.SelectMany(x => new[] {
new {Date = x.Item1, type = "S"},
new {Date = x.Item2, type = "E"}
}).Where(x => x.Date != null).OrderBy(x => x.Date).ToArray();
var result = new List<Tuple<DateTime?, DateTime?>>();
int i = 0;
do
{
if (i == 0 && dateList[i].type == "E")
{
result.Add(new Tuple<DateTime?, DateTime?>(null, dateList[i].Date));
}
else if (i + 1 == dateList.Count() && dateList[i].type == "S")
{
result.Add(new Tuple<DateTime?, DateTime?>(dateList[i].Date, null));
}
else
{
if (dateList[i].type == "S" && dateList[i+1].type == "E")
{
result.Add(new Tuple<DateTime?, DateTime?>(dateList[i].Date, dateList[i + 1].Date));
i++;
}
}
i++;
} while (i < dateList.Count());
我建議你創造一些與'性質DateRange'類'StartDate'和'EndDate'而不是使用元組無意義'Item1'和'Item2'性能。您還可以創建諸如「Intersects」之類的方法來檢查時間範圍是否相交,並使用「Intersetion」方法來獲取兩個範圍內的新時間範圍。 –
是您的輸入列表中的日期順序(即較大的EndDate從未出現在較小的日期之前)? – publicgk