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

标签 c# collections grouping dayofweek nodatime

我正在使用 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/

相关文章:

macros - GroupedAttachments 宏属性组是否复数?

arrays - 对具有相同 ID 的元素进行分组并找到最大值及其位置

c# - Entity Framework 记录重复项

r - R 中的字符串字段分组

c# - 访问 SFTP 站点 : The requested name is valid, 时出现异常,但未找到请求类型的数据

java - 非顺序索引集合

cocoa - 对多个 NSMutableArray 进行排序

php - 如何使用foreach遍历两个相同长度的集合

c# - 在内存中存储大量股票数据的最佳方式(变量)

c# - 如何更改 GraphicsPath 内的点的坐标?