gpt4 book ai didi

c# - 将一周中的几天列表分组为连续几天的组

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

我正在使用 C# 创建一个接受 NodaTime.IsoDayOfWeek 天列表的函数。我想将输入分组为连续几天的组。

例如,以下列表应提供以下输出:

{ Mon, Tue } => { { Mon, Tue } }
{ Mon, Wed } => { { Mon }, { Wed } }
{ Mon, Tue, Fri, Sat } => { { Mon, Tue }, { Fri, Sat } }
{ Mon, Wed, Fri, Sun } => { { Sun, Mon }, { Wed }, { Fri } }
{ Mon, Tue, Wed, Thu, Fri, Sat, Sun } => { { Mon, Tue, Wed, Thu, Fri, Sat, Sun } }

注意周日和周一是连续的,所以列表是一个闭环。此外,结果列表的顺序应使第一天直接跟在输入列表中未包含的那一天之后(如果包含完整列表,则为星期一)。

Mauricio Scheffer published a great extension method to group consecutive integers here:

public static IEnumerable<IEnumerable<int>> GroupConsecutive(this IEnumerable<int> list) {
var group = new List<int>();
foreach (var i in list) {
if (group.Count == 0 || i - group[group.Count - 1] <= 1)
group.Add(i);
else {
yield return group;
group = new List<int> {i};
}
}
yield return group;
}

但是我不知道如何修改它以将日期分组,因为星期日和星期一也是连续的。如何将星期日和星期一也视为连续的连续日子分组?

最佳答案

示例输入是有序数组。假设您的输入是从 1 到 7 的数组,而不是按顺序排列,您必须使用 2 个循环来按条件 Abs(current-next) == 1 || 查找每个下一个数字Abs(current-next) == 6。这是我对您的解决方案的想法:

public static IEnumerable<IEnumerable<int>> GroupDay(IEnumerable<int> list)
{
List<int> input = new List<int>(list);

while (input.Count > 0)
{
int i = input[0];
var group = new List<int>();
group.Add(i);
input.RemoveAt(0);

for (int j = 0; j < input.Count; )
{
if (Math.Abs(group[group.Count - 1] - input[j]) == 1
|| Math.Abs(group[0] - input[j]) == 6)
{
group.Add(input[j]);
input.RemoveAt(j);
}
else
{
j++;
}
}

// Sort output
group.Sort((x, y) => {
if (Math.Abs(x - y) == 6)
{
// Sunday and Monday case
return y - x;
}
else
return x - y;
});
yield return group;
}
}

关于c# - 将一周中的几天列表分组为连续几天的组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38432771/

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