我正在使用 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(当前-下一个) == 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/