gpt4 book ai didi

c# - 这是找到给定月份每周的好算法吗?

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

我需要用一个月(定义为开始日期和结束日期)并返回该月每周的一组日期范围。一周定义为星期日到星期六。如果您在开始栏中双击您的 Windows 日期,则一种可视化它的好方法:

enter image description here

2011 年 10 月有 6 周:10/1-10/1、10/2-10/8、10/9-10/15、10/16-10/22、10/23-10/29 日和 10/30-10/31。

我可以将每周描述为一个结构:

   struct Range
{
public DateTime Start;
public DateTime End;

public Range(DateTime start, DateTime end)
{
Start = start;
End = end;
}
}

我需要编写一个函数,它需要一个月的时间并返回其中的一个范围数组。这是我的第一次尝试,它似乎有效并解决了明显的边缘情况:

public static IEnumerable<Range> GetRange(DateTime start, DateTime end)
{
DateTime curStart = start;
DateTime curPtr = start;
do
{
if (curPtr.DayOfWeek == DayOfWeek.Saturday)
{
yield return new Range(curStart, curPtr);
curStart = curPtr.AddDays(1);
}

curPtr = curPtr.AddDays(1);
} while (curPtr <= end);

if(curStart <= end)
yield return new Range(curStart, end);
}

我想知道是否有更简洁或更明显的方法来做同样的事情。我不太关心性能,但我想提高代码的可读性并使算法更简洁一些。也许有一个非常有创意的解决方案涉及单个 LINQ 表达式或其他东西。谢谢!

最佳答案

正如 Previti 所建议的那样,这是基于简单地增加 7,以供国际使用。如果您的 C# < 4.0,请删除默认参数 = DayOfWeek.Sunday

public static IEnumerable<Range> GetRange(DateTime start, DateTime end, DayOfWeek startOfTheWeek = DayOfWeek.Sunday)
{
if (start > end)
{
throw new ArgumentException();
}

// We "round" the dates to the beginning of the day each
start = start.Date;
end = end.Date;

// The first week. It could be "shorter" than normal. We return it "manually" here
// The 6 + startOfWeek - start.DayOfWeek will give us the number of days that you
// have to add to complete the week. It's mod 7. It's based on the idea that
// the starting day of the week is a parameter.
DateTime curDay = new DateTime(Math.Min(start.AddDays((6 + (int)startOfTheWeek - (int)start.DayOfWeek) % 7).Ticks, end.Ticks), start.Kind);

yield return new Range(start, curDay);

curDay = curDay.AddDays(1);

while (curDay <= end)
{
// Each time we add 7 (SIX) days. This is because the difference between
// as considered by the problem, it's only 6 * 24 hours (because the week
// doesn't end at 23:59:59 of the last day, but at the beginning of that day)
DateTime nextDay = new DateTime(Math.Min(curDay.AddDays(6).Ticks, end.Ticks), start.Kind);

yield return new Range(curDay, nextDay);

// The start of the next week
curDay = nextDay.AddDays(1);
}
}

一些小笔记:Math.Min没有为 DateTime 定义, 所以我通过 Ticks 来作弊的 DateTime s 并比较它们。然后我重建 DateTime .我总是使用 DateTimeKindstart日期。

调试时yield代码,请记住通过使用 ToList 来“具体化”结果或 ToArray , 否则代码不会被执行:-)

关于c# - 这是找到给定月份每周的好算法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7811238/

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