C# 一种求给定时间间隔内所有星期日和星期五的优化算法
我有一个标志枚举代表一周中的每一天。(星期日、星期一等)。我们将其称为C# 一种求给定时间间隔内所有星期日和星期五的优化算法,c#,algorithm,linq,datetime,C#,Algorithm,Linq,Datetime,我有一个标志枚举代表一周中的每一天。(星期日、星期一等)。我们将其称为工作日枚举。现在给定一个时间间隔,在平日变量中查找日期的所有日期 例如:weekdaysall=WeekDays.Sunday | WeekDays.fride 现在查找给定时间间隔内所有周日和周五日期的日期 所以我想到了以下逻辑:找到第一个星期天,星期五,如上面的例子所示。 将这些日期添加到临时字典中。现在迭代该字典并继续添加7天,直到达到结束间隔 int dayCounter = 0; WeekDays daysAll =
工作日
枚举。现在给定一个时间间隔,在平日
变量中查找日期的所有日期
例如:weekdaysall=WeekDays.Sunday | WeekDays.fride代码>
现在查找给定时间间隔内所有周日和周五日期的日期
所以我想到了以下逻辑:找到第一个星期天,星期五,如上面的例子所示。
将这些日期添加到临时字典中。现在迭代该字典并继续添加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++;
}
int dayCounter=0;
平日所有=平日.周日|平日.周五;
Dictionary tempDict=新字典();
对于(var day=IntervalsStartDate.Date;(dayCounter<7&&day.Date 0)
{
List allDates=新列表();
var keys=新列表(tempDict.keys);
bool opComplete=false;
而(!opComplete)
{
foreach(星期一星期五星期天钥匙)
{
if(tempDict[dayOfWeek]>intervalEndDate.Date){opComplete=true;break;}
添加(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);
}
}
这里的好处是,您可以轻松地查询一周中的其他日期等
对于优化后的代码,如果您指的是性能,那么最好不要逐个迭代,而是找到第一个星期五或星期天,然后根据日期增加2天或5天在大多数情况下,性能优化和更清晰的代码并不相同
更清晰的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);
}
}
这里的好处是,您可以轻松地查询一周中的其他日期等
对于优化的代码,如果您是指性能,那么最好不要逐个迭代,而是找到第一个星期五或星期天,然后根据日期增加2天或5天,作为一种常规方法,在一周中的某一天传递开始日期和结束日期
private List<DateTime> GetDates(DateTime startDate, DateTime endDate, DayOfWeek dayOfWeek)
{
var returnDates = new List<DateTime>();
for (DateTime dateCounter = startDate; dateCounter < endDate; dateCounter = dateCounter.AddDays(1))
{
if (dateCounter.DayOfWeek == dayOfWeek)
{
returnDates.Add(dateCounter);
}
}
return returnDates;
}
作为一种通用方法,有几种方法可以在一周中的某一天传递开始日期和结束日期
private List<DateTime> GetDates(DateTime startDate, DateTime endDate, DayOfWeek dayOfWeek)
{
var returnDates = new List<DateTime>();
for (DateTime dateCounter = startDate; dateCounter < endDate; dateCounter = dateCounter.AddDays(1))
{
if (dateCounter.DayOfWeek == dayOfWeek)
{
returnDates.Add(dateCounter);
}
}
return returnDates;
}
LINQ看起来更干净,但至于优化问题,在第一个星期日和星期五被发现,然后添加了7。你认为这个ALGO也可以用LINQ编写吗?@ AbHi:尽管你添加7天的算法可能更快,但是你有算法设置时间要考虑,并且在设置TH时有非零时间。每周使用迭代器检查您的密钥字典。如果您查找四天或更长时间,您的算法可能会更慢。此答案为您提供了一种简单的工作方法,可以满足您的需要。您应该使用它来让您的程序工作。如果分析显示此方法导致工作程序出现瓶颈,则你应该考虑优化它。LINQ看起来更干净,但是在优化问题上,第一个星期日和星期五被发现,然后增加了7。你认为这个ALGO也可以用LINQ编写吗?”AbHi:尽管你的添加7天的算法可能更快,但是你有算法设置的时间来考虑,并且有。每周设置迭代器以查看密钥字典所需的非零时间。如果搜索时间超过四天,则算法可能会变慢。此答案为您提供了一种简单的工作方法,可以满足您的需要。您应该使用它使程序工作。如果分析显示此方法导致错误您的工作程序中存在瓶颈,那么您应该考虑对其进行优化。在这里,我们迭代所有日期,这对性能不是很好,在我们的代码示例中,我们找到了第一个星期日、星期五,然后添加了7。这也可以用LINQ实现吗?如果您真的非常关心性能,我建议不要使用LINQ。算法是最令人感兴趣的是,实现也很重要,但对我来说是在algo之后。至于LINQ与for的性能,有很多争论,但我会选择LINQ,因为在未来的框架中,性能可能会更好,也会让我看起来更酷:)这里我们迭代所有日期,对性能来说不是很好,在我们的代码示例中,我们找到了第一个星期日、星期五,然后添加了7。LINQ也可以这样做吗?如果你真的那么在乎性能,我会建议你不要使用LINQ。算法是我最感兴趣的,实现也是很重要的,但对我来说是在算法之后。至于LINQ和for的性能,有很多争论,但我会选择LINQ,因为在未来的框架中,性能可能会更好,也会让我看起来更酷:)
private List<DateTime> GetDates(DateTime startDate, DateTime endDate)
{
var returnDates = new List<DateTime>();
for (DateTime dateCounter = startDate; dateCounter < endDate; dateCounter = dateCounter.AddDays(1))
{
returnDates.Add(dateCounter);
}
return returnDates;
}
var myDates = GetDates(DateTime.Now, DateTime.Now.AddDays(30)).Where(i => i.DayOfWeek == DayOfWeek.Friday);