我正在嘗試創建一個函式,該函式回傳從特定日期開始的連續日期范圍中的日期數。
例子:
開始日期:2022 年 9 月 1 日
日期范圍:2022 年 9 月 1 日、2022 年 9 月 2 日、2022 年 9 月 3 日、2022 年 9 月 4 日、2022 年 9 月 7 日
在這種情況下,我正在尋找的函式將回傳 4。
假設日期可能是無序的并且它們可以滾動到下個月,因此使用 StartDate 9/29/2022:
9/29/2022、9/30/2022、10/1/2022、10/4/2022 將回傳 3。
我知道我可以遍歷從特定日期開始的日期并檢查連續天數,但我想知道是否有一種干凈的方法可以用 Linq 做到這一點。
uj5u.com熱心網友回復:
這是我能想到的最干凈的解決方案......
var startDate = new DateTime(2022, 9, 1);
var days = new List<DateTime>()
{
new(2022, 8, 28),
new(2022, 9, 1),
new(2022, 9, 2),
new(2022, 9, 3),
new(2022, 9, 4),
new(2022, 9, 7)
};
var consecutiveDays = GetConsecutiveDays(startDate, days);
foreach (var day in consecutiveDays)
{
Console.WriteLine(day);
}
Console.ReadKey();
static IEnumerable<DateTime> GetConsecutiveDays(DateTime startDate, IEnumerable<DateTime> days)
{
var wantedDate = startDate;
foreach (var day in days.Where(d => d >= startDate).OrderBy(d => d))
{
if (day == wantedDate)
{
yield return day;
wantedDate = wantedDate.AddDays(1);
}
else
{
yield break;
}
}
}
輸出為: 01.09.2022 0:00:00 02.09.2022 0:00:00 03.09.2022 0:00:00 04.09.2022 0:00:00
如果你想要計數,你可以在結果上呼叫 .Count() 或者只是修改方法......應該很容易。
uj5u.com熱心網友回復:
要計算日期范圍內的連續日期數:
class Program
{
private static void Main(string[] args)
{
string dateRange = "10/4/2022, 9/29/2022, 10/1/2022, 9/30/2022";
List<DateTime> dates = new List<DateTime>();
foreach (var dateStr in dateRange.Split(", "))
{
// split date string to individual parts
var dateData = dateStr.Split("/");
// parse to DateTime
int month = int.Parse(dateData[0]);
int day = int.Parse(dateData[1]);
int year = int.Parse(dateData[2]);
var date = new DateTime(year, month, day);
// add date to list
dates.Add(date);
}
// order the dates
dates = dates.OrderBy(x => x).ToList();
// count for consecutive days in the date range
var consecutiveDatesCounter = 1; // 1 to count for start date
dates.Aggregate((last, next) =>
{
if (last.AddDays(1) == next)
consecutiveDatesCounter ;
else
return last; // to prevent counting later consecutive dates
return next;
});
// Display result
Console.WriteLine(consecutiveDatesCounter);
}
}
輸出:
3
uj5u.com熱心網友回復:
使用回圈可能是最干凈的方法。我會使用以下內容:
List<DateTime> GetConsecutiveDates(IEnumerable<DateTime> range, DateTime startDate)
{
var orderedRange = range.OrderBy(d => d).ToList();
int startDateIndex = orderedRange.IndexOf(startDate);
if (startDateIndex == -1) return null;
var consecutiveDates = new List<DateTime> { orderedRange[startDateIndex] };
for (int i = startDateIndex 1; i < orderedRange.Count; i )
{
if (orderedRange[i] != orderedRange[i - 1].AddDays(1)) break;
consecutiveDates.Add(orderedRange[i]);
}
return consecutiveDates;
}
uj5u.com熱心網友回復:
使用回圈的另一種方法。(我同意其他人的說法,即回圈比使用 Linq 完成這項任務更干凈。)
public static int NumConsecutiveDays(IEnumerable<DateTime> dates)
{
var previous = DateTime.MinValue;
var oneDay = TimeSpan.FromDays(1);
int result = 0;
foreach (var current in dates.OrderBy(d => d))
{
if (current.Date - previous.Date == oneDay)
result;
previous = current;
}
return result > 0 ? result 1 : 0; // Need to add 1 to result if it is not zero.
}
uj5u.com熱心網友回復:
var dates = new List<DateTime>() {new DateTime(2014,1,1), new DateTime(2014, 1, 2), new DateTime(2014, 1, 3) , new DateTime(2014, 1, 5), new DateTime(2014, 1, 6), new DateTime(2014, 1, 8) };
var startDate = new DateTime(2014,1,2);
var EarliestContiguousDates = dates.Where(x => x>=startDate).OrderBy(x => x)
.Select((x, i) => new { date = x, RangeStartDate = x.AddDays(-i) })
.TakeWhile(x => x.RangeStartDate == dates.Where(y => y >= startDate).Min()).Count();
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/515637.html
上一篇:在界面中選擇以獲得更好的性能
