gpt4 book ai didi

c# - 用于查找给定时间间隔内所有星期日和星期五的优化算法

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:38:26 25 4
gpt4 key购买 nike

我有一个标志枚举来代表一周中的每一天。 (星期日、星期一等)。让我们称其为 WeekDay 枚举。现在给定一个间隔,在 WeekDays 变量中查找所有日期。

例如:WeekDays daysAll = WeekDays.Sunday | WeekDays.Friday;现在查找给定时间间隔内所有星期日和星期五的日期。

于是想到了如下逻辑: 找到第一个星期日,星期五,如上例。将这些日期添加到临时字典中。现在迭代该字典并继续添加 7 天,直到达到结束间隔。

int dayCounter = 0;
WeekDays daysAll = WeekDays.Sunday | WeekDays.Friday;
Dictionary<DayOfWeek, DateTime> tempDict = new Dictionary<DayOfWeek, DateTime>();
for (var day = intervalStartDate.Date; (dayCounter < 7 && day.Date <= intervalEndDate.Date); day = day.AddDays(1))
{
WeekDays check = GetWeekDayFromDayOfWeek(day.DayOfWeek); //This Function converts from the DateTime DayOfweek enum to the WeekDays enum.
if ((check & daysAll) == check)
{
tempDict.Add(day.DayOfWeek, day);
}
dayCounter++;
}

现在继续为字典中的每个日期添加 7 天,直到达到结束间隔:

if (tempDict.Keys.Count > 0)
{
List<DateTime> allDates = new List<DateTime>();
var keys = new List<DayOfWeek>(tempDict.Keys);
bool opComplete = false;
while (!opComplete)
{
foreach (DayOfWeek dayOfWeek in keys)
{
if (tempDict[dayOfWeek] > intervalEndDate.Date) { opComplete = true; break; }
allDates.Add(tempDict[dayOfWeek]);
tempDict[dayOfWeek] = tempDict[dayOfWeek].AddDays(7);
}
}
}

所以我的问题是:这个算法可以改进吗? LinQ 能否用于使代码本身的意图更加清晰?

最佳答案

性能优化和更清晰的代码在大多数情况下并不相同。

更清晰的 LINQ 版本应该是这样的:

public IEnumerable<DateTime> IntervalDays(DateTime start, DateTime end)
{
if (start > end)
yield break;

var d = start.Date;

while (d <= end.Date)
{
yield return d;
d = d.AddDays(1);
}
}

然后您按照本例编写查询:

IntervalDays(startDate, endDate)
.Where(d=>d.DayOfWeek==DayOfWeek.Friday || d.DayOfWeek==DayOfWeek.Sunday);

这里的好处是您可以轻松查询一周中的其他日子等。

对于优化代码,如果你的意思是性能,你最好不要一个一个地迭代,而是找到第一个星期五或星期日,然后根据日期增加 2 或 5 天

关于c# - 用于查找给定时间间隔内所有星期日和星期五的优化算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22372657/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com