Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 一种求给定时间间隔内所有星期日和星期五的优化算法_C#_Algorithm_Linq_Datetime - Fatal编程技术网

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);