gpt4 book ai didi

c# - 在 DayOfWeek 列表中查找最近的工作日

转载 作者:行者123 更新时间:2023-11-30 20:29:23 25 4
gpt4 key购买 nike

这可能是一个新手问题,但这里是。

我有一种方法,其中类型 DayOfWeek 列表会附加一周中的不同日期(可能是星期三和星期六、星期日、星期一和星期五等)。

给定该列表,我需要将其与日期时间参数进行比较,在 DayOfWeek 列表中找到与 DateTime 参数最接近的工作日,并根据列表中的工作日向 DateTime 参数添加天数。

例如,如果传入的 DateTime 参数是星期日,而我的 DayOfWeek 列表包含星期三和星期六,则需要将该参数移回星期六,因为它在列表中最接近。

同样,如果我的列表包含星期日、星期一和星期六,而传入的参数是星期四,则必须将参数移至星期六。

最后,如果参数与列表中的两个工作日等距(传入星期三,星期一和星期五在列表中...或者传入星期日,列表中星期二和星期五),则参数需要向前移动到下一个最近的工作日(在第一种情况下为星期五,在第二种情况下为星期二)。

将下一个最近的工作日的距离从传入的日期转换为整数是理想的(至少对我来说),这样我可以做类似的事情:

passedInDate = passedInDate.AddDays(dayOfWeekDistance);
return passedInDate;

但我愿意接受建议。

我尝试过 LINQ 语句,例如:

int dayOfWeekDistance = targetDayOfWeekList.Min(x => (x - passedInDate));

但是没有效果。我一定缺少一些奇特的 LINQ 语句。

请注意,如果传入的日期是星期日并且列表中最接近的工作日是星期六,则我无法开始工作的主要项目是日期从星期日回溯到星期六(同样,如果传入的日期是星期一,最近的工作日是星期五,该日期需要一直回溯到星期五)。

如果我错过了什么或者我只是没有讲明白,请告诉我。

欢迎所有帮助!谢谢。

最佳答案

让我们将问题分成几个小部分。

注意:以下所有方法都应该放在这样的类中

public static class DayOfWeekExtensions
{
}

首先,您希望Sunday 成为一周的最后一天,而在DayOfWeek enum 中它首先被定义。因此,让我们创建一个函数来解释这一点:

public static int GetIndex(this DayOfWeek source)
{
return source == DayOfWeek.Sunday ? 6 : (int)source - 1;
}

然后我们需要一个函数来计算两个 DayOfWeek 值之间的距离(偏移量):

public static int OffsetTo(this DayOfWeek source, DayOfWeek target)
{
return source.GetIndex() - target.GetIndex();
}

我们还添加一个函数,给定一个主元和两个 DayOfWeek 值,选择两个值中最接近的值(应用前向优先级规则):

public static DayOfWeek Closest(this DayOfWeek pivot, DayOfWeek first, DayOfWeek second)
{
int comp = Math.Abs(first.OffsetTo(pivot)).CompareTo(Math.Abs(second.OffsetTo(pivot)));
return comp < 0 || (comp == 0 && first.GetIndex() > pivot.GetIndex()) ? first : second;
}

现在我们准备实现从序列中查找最接近日期的方法。它可以通过多种方式实现,这里是使用(最后!:) LINQ Aggregate 的实现。方法:

public static DayOfWeek? Closest(this IEnumerable<DayOfWeek> source, DayOfWeek target)
{
if (!source.Any()) return null;
return source.Aggregate((first, second) => target.Closest(first, second));
}

最后,添加一个计算最近距离的函数:

public static int ClosestDistance(this IEnumerable<DayOfWeek> source, DayOfWeek target)
{
return source.Closest(target)?.OffsetTo(target) ?? 0;
}

我们就完成了。我们刚刚创建了一个小的简单的可重用实用程序类。

您的情况的用法是:

int dayOfWeekDistance = targetDayOfWeekList.ClosestDistance(passedInDate.DayOfWeek);

更新:事实证明您的要求不同。

应用相同的原理,首先我们需要一个函数来计算一周中两天之间的向前和向后距离的最小值,应用向前优先规则。

public static int MinDistanceTo(this DayOfWeek from, DayOfWeek to)
{
int dist = to - from;
return dist >= 4 ? dist - 7 : dist <= -4 ? dist + 7 : dist;
}

它的作用基本上是将可能的 -6..6 包含范围内的值转换为 -3..3 包含范围内的值。

然后我们只需要一个函数,它将通过使用 Select + Aggregate 来实现所讨论的方法(也可以使用 Min 来实现) 和自定义比较器)。它基本上比较两个绝对距离并再次应用前向优先级规则:

public static int MinDistanceTo(this DayOfWeek from, IEnumerable<DayOfWeek> to)
{
if (!to.Any()) return 0;
return to.Select(x => from.MinDistanceTo(x)).Aggregate((dist1, dist2) =>
{
if (dist1 == dist2) return dist1;
int comp = Math.Abs(dist1).CompareTo(Math.Abs(dist2));
return comp < 0 || (comp == 0 && dist1 > 0) ? dist1 : dist2;
});
}

用法是:

int dayOfWeekDistance = passedInDate.DayOfWeek.MinDistanceTo(targetDayOfWeekList);

关于c# - 在 DayOfWeek 列表中查找最近的工作日,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46182046/

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