LINQ GroupBy 连续时间

2023-11-25

假设我有一个如下所示的简单结构:

public class Range
{
    public DateTime Start { get; set; }
    public DateTime End { get; set; }

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

我创建了一个像这样的集合:

var dr1 = new Range(new DateTime(2011, 11, 1, 12, 0, 0), 
    new DateTime(2011, 11, 1, 13, 0, 0));
var dr2 = new Range(new DateTime(2011, 11, 1, 13, 0, 0), 
    new DateTime(2011, 11, 1, 14, 0, 0));
var dr3 = new Range(new DateTime(2011, 11, 1, 14, 0, 0), 
    new DateTime(2011, 11, 1, 15, 0, 0));
var dr4 = new Range(new DateTime(2011, 11, 1, 16, 0, 0), 
    new DateTime(2011, 11, 1, 17, 0, 0));

var ranges = new List<Range>() { dr1, dr2, dr3, dr4 };

我想要做的是将连续的范围进行分组 - 即,如果前一个范围的结束值与下一个范围的开始值相同,则它们是连续的。

我们可以假设范围值不存在冲突/重复或重叠。

在发布的示例中,我最终会得到两个组:

2011-11-1 12:00:00 - 2011-11-1 15:00:00

2011-11-1 16:00:00 - 2011-11-1 17:00:00

为此提出迭代解决方案相当容易。但是我可以使用一些 LINQ 魔法来以漂亮的单行代码实现这一点吗?


你最好的选择是使用yield和扩展方法:

static IEnumerable<Range> GroupContinuous(this IEnumerable<Range> ranges)
{
    // Validate parameters.

    // Can order by start date, no overlaps, no collisions
    ranges = ranges.OrderBy(r => r.Start);

    // Get the enumerator.
    using (IEnumerator<Range> enumerator = ranges.GetEnumerator();
    {
        // Move to the first item, if nothing, break.
        if (!enumerator.MoveNext()) yield break;

        // Set the previous range.
        Range previous = enumerator.Current;

        // Cycle while there are more items.
        while (enumerator.MoveNext())
        {
            // Get the current item.
            Range current = enumerator.Current;

            // If the start date is equal to the end date
            // then merge with the previous and continue.
            if (current.Start == previous.End)
            {
                // Merge.
                previous = new Range(previous.Start, current.End);

                // Continue.
                continue;
            }

            // Yield the previous item.
            yield return previous;

            // The previous item is the current item.
            previous = current;
        }

        // Yield the previous item.
        yield return previous;
    }
}

当然,调用OrderBy将导致完整的迭代ranges顺序,但无法避免。一旦您订购了它,您就可以避免在返回结果之前必须实现结果;你只需yield如果条件允许的话结果。

但是,如果您知道序列是有序的,则不必调用OrderBy完全可以,而且你可以yield当您遍历列表并在不同的折叠处中断时的项目Range实例。

最终,如果序列是无序的,那么您有两个选择:

  • 对列表进行排序然后进行处理(记住,OrderBy也被推迟,但必须使用一次完整的迭代来排序序列),使用yield当您有物品需要处理时退回该物品
  • 立即处理整个序列并作为整个物化序列返回
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LINQ GroupBy 连续时间 的相关文章

  • ROWNUM 的 OracleType 是什么

    我试图参数化所有现有的 sql 但以下代码给了我一个问题 command CommandText String Format SELECT FROM 0 WHERE ROWNUM lt maxRecords command CommandT
  • 创建 DirectoryEntry 实例以供测试使用

    我正在尝试创建 DirectoryEntry 的实例 以便可以使用它来测试将传递 DirectoryEntry 的一些代码 然而 尽管进行了很多尝试 我还是找不到实例化 DE 并初始化它的 PropertyCollection 的方法 我有
  • 属性对象什么时候创建?

    由于属性实际上只是附加到程序集的元数据 这是否意味着属性对象仅根据请求创建 例如当您调用 GetCustomAttributes 时 或者它们是在创建对象时创建的 或者 前两个的组合 在由于 CLR 的属性扫描而创建对象时创建 从 CLR
  • C++ 求二维数组每一行的最大值

    我已经设法用这个找到我的二维数组的每一行的最小值 void findLowest int A Cm int n int m int min A 0 0 for int i 0 i lt n i for int j 0 j lt m j if
  • SSH 主机密钥指纹与模式 C# WinSCP 不匹配

    我尝试通过 WinSCP 使用 C 连接到 FTPS 服务器 但收到此错误 SSH 主机密钥指纹 与模式不匹配 经过大量研究 我相信这与密钥的长度有关 当使用 服务器和协议信息 下的界面进行连接时 我从 WinSCP 获得的密钥是xx xx
  • 为什么禁止在 constexpr 函数中使用 goto?

    C 14 对你能做什么和不能做什么有规则constexpr功能 其中一些 没有asm 没有静态变量 看起来相当合理 但标准也不允许goto in constexpr功能 即使它允许其他控制流机制 这种区别背后的原因是什么 我以为我们已经过去
  • 跨多个控件共享事件处理程序

    在我用 C 编写的 Windows 窗体应用程序中 我有一堆按钮 当用户的鼠标悬停在按钮上时 我希望按钮的边框发生变化 目前我有以下多个实例 每个按钮一个副本 private void btnStopServer MouseEnter ob
  • 如何在 WPF RichTextBox 中跟踪 TextPointer?

    我正在尝试了解 WPF RichTextBox 中的 TextPointer 类 我希望能够跟踪它们 以便我可以将信息与文本中的区域相关联 我目前正在使用一个非常简单的示例来尝试弄清楚发生了什么 在 PreviewKeyDown 事件中 我
  • 写入和读取文本文件 - C# Windows 通用平台应用程序 Windows 10

    有用 但在显示任何内容之前 您必须在文本框中输入内容 我想那是因为我使用了 TextChanged 事件处理程序 如果我希望它在没有用户交互的情况下显示文本文件的内容 我应该使用哪个事件处理程序 因此 我想在按下按钮时将一些数据写入 C W
  • 如何针对 Nancy 中的 Active Directory 进行身份验证?

    这是一篇过时的文章 但是http msdn microsoft com en us library ff650308 aspx paght000026 step3 http msdn microsoft com en us library
  • c 中的错误:声明隐藏了全局范围内的变量

    当我尝试编译以下代码时 我收到此错误消息 错误 声明隐藏了全局范围内的变量 无效迭代器 节点 根 我不明白我到底在哪里隐藏或隐藏了之前声明的全局变量 我怎样才能解决这个问题 typedef node typedef struct node
  • 是否有比 lex/flex 更好(更现代)的工具来生成 C++ 分词器?

    我最近将源文件解析添加到现有工具中 该工具从复杂的命令行参数生成输出文件 命令行参数变得如此复杂 以至于我们开始允许它们作为一个文件提供 该文件被解析为一个非常大的命令行 但语法仍然很尴尬 因此我添加了使用更合理的语法解析源文件的功能 我使
  • 初始化变量的不同方式

    在 C 中初始化变量有多种方法 int z 3 与 int 相同z 3 Is int z z 3 same as int z z 3 您可以使用 int z z 3 Or just int z 3 Or int z 3 Or int z i
  • 更改窗口的内容 (WPF)

    我创建了一个简单的 WPF 应用程序 它有两个 Windows 用户在第一个窗口中填写一些信息 然后单击 确定 这会将他们带到第二个窗口 这工作正常 但我试图将两个窗口合并到一个窗口中 这样只是内容发生了变化 我设法找到了这个更改窗口内容时
  • .NET 选项将视频文件流式传输为网络摄像头图像

    我有兴趣开发一个应用程序 它允许我从 xml 构建视频列表 包含视频标题 持续时间等 并将该列表作为我的网络摄像头流播放 这意味着 如果我要访问 ustream tv 或在实时通讯软件上激活我的网络摄像头 我的视频播放列表将注册为我的活动网
  • 网络参考共享类

    我用 Java 编写了一些 SOAP Web 服务 在 JBoss 5 1 上运行 其中两个共享一个类 AddressTO Web 服务在我的 ApplycationServer 上正确部署 一切都很顺利 直到我尝试在我的 C 客户端中使用
  • 检查 url 是否指向文件或页面

    我们需要以下内容 如果文件确实是文件 则从 URL 下载该文件 否则 如果它是一个页面 则什么也不做 举个简单的例子 我有以下命令来下载文件 My Computer Network DownloadFile http www wired c
  • 如何构建印度尼西亚电话号码正则表达式

    这些是一些印度尼西亚的电话号码 08xxxxxxxxx 至少包含 11 个字符长度 08xxxxxxxxxxx 始终以 08 开头 我发现这个很有用 Regex regex new Regex 08 0 9 0 9 0 9 0 9 0 9
  • 窗体最大化时自动缩放子控件

    有没有办法在最大化屏幕或更改分辨率时使 Windows 窗体上的所有内容自动缩放 我发现手动缩放它是正确的 但是当切换分辨率时我每次都必须更改它 this AutoScaleDimensions new System Drawing Siz
  • C++ 成员函数中的“if (!this)”有多糟糕?

    如果我遇到旧代码if this return 在应用程序中 这种风险有多严重 它是一个危险的定时炸弹 需要立即在应用程序范围内进行搜索和销毁工作 还是更像是一种可以悄悄留在原处的代码气味 我不打算writing当然 执行此操作的代码 相反

随机推荐

  • 如何在 qWeb 报告、Odoo 中设置 PDF 名称?

    我正在 Odoo 8 中使用 qWeb 制作报告 这些生成的 PDF 文件以 默认 名称保存 我想为每个生成的文件设置一个特定的名称 不是在保存文件之后 而是在 生成 时间 那可能吗 如果是的话 该怎么办呢 提前致谢 在 Odoo 8 中
  • 未检测到的 Chromedriver 未正确加载

    我正在尝试使用带有 selenium 的无头 chrome 浏览器 它也绕过了机器人检测测试 目前使用以下项目https github com ultrafunkamsterdam unDetected chromedriver每次我尝试实
  • 使用 ffmpeg_extract_subclip 提取视频的一部分 - 黑帧

    我正在尝试使用 ffmpeg extract subclip 用于提取视频的一部分 我面临着一些问题 1 当我剪切小视频 1 3秒 时 出现黑帧 只有音频在工作 2 当我剪切较长的视频时 输出的视频在结束前卡住了2 3秒 这是我的简单代码
  • iPhone 上的 UIWebView 电话链接检测

    我的代码中有一些奇怪的东西 我肯定会忘记一些事情 但我不知道是什么 我尝试在 UIWebView 中处理电话 短信邮件和 http 链接 这就是我尝试的方法 1 实例化 UIWebView webview UIWebView alloc i
  • 如何在 ggplot2 的轴标签中同时使用上标和变量

    我想一起使用一个变量 此处为向量元素 类型 和一个在 n 轴标签内包含上标 此处为 m 2 的单位 data lt list houses data frame surface c 450 320 280 price c 12 14 6 f
  • 如何在Android UI线程中异步执行一些代码?

    我是 Android 开发新手 我从事 Swing 和 SWT 工作已有好几年了 Swing 和 SWT 都有在 UI 线程同步和异步执行代码的策略 典型的用法是在一个线程中执行一些耗时的工作 然后在 UI 线程异步中显示结果 所以我的问题
  • OpenCV 3.0上的GPU函数在哪里?

    据我了解 在 OpenCV 3 0 中 GPU 模块已被 CUDA 模块取代 或者更好的是它已被拆分为多个模块 So cv gpu GpuMat已被替换为cv cuda GpuMat fine 但是功能呢 例如 以下内容已移至 cv gpu
  • Jenkins 上的多个 JUnit XML 结果,用单独的图表发布?

    我有多个测试作为 Android Jenkins 构建的一部分运行 包括单元测试和功能测试 我能够在 Jenkins 上成功发布测试结果 但我想查看单元测试和功能测试的单独结果图 Jenkins JUnit 发布者仅显示多个 XML 文件的
  • 数组:array_shift($arr) 还是 $arr[0]?

    您会使用哪一个 基本上我只想从数组中获取第一个元素 就是这样 嗯 他们做不同的事情 array shift arr 从数组中取出第一个元素 并将其提供给您 arr 0 只是给你 if该数组有数字键 另一种也适用于关联数组的替代方法是rese
  • MSVC errno 线程安全

    Is errnoMSVC 线程安全吗 根据中的答案这个问题POSIX 要求errno是线程安全的 但 MSVC 可能不符合 POSIX 标准并且MSDN没有告诉任何有关线程安全的信息 MSDN 矛盾地提到errno被声明为extern in
  • Python 类构造函数中是否有 `self.somevariable = somevariable` 的快捷方式?

    Python 中的构造函数通常如下所示 class SomeClass def init self a b None c defC self a a self b b or self c c 有没有捷径 例如简单地定义 init self
  • 使用 RAR 压缩文件

    我有一个文本文件 我想在它达到指定大小后对其进行压缩 我已经看过了GZipStream效果很好 但 RAR 压缩要好得多 我一直在寻找一个可以的图书馆compress一个 RAR 文件 我真的不关心解压或解压缩 但我还没有找到 As the
  • 如何使用外部 .py 文件?

    我下载了 beautifulsoup py 用于我正在制作的一个小项目 我需要在我的项目中导入这个 py 文件吗 我是否只需将代码复制并粘贴到当前 python 脚本中的某个位置 感谢您的帮助 我发现了这个 但它没有说任何有关 Window
  • 将 pandas'to_html' 保存为文件

    我有一个 DataFrame tsod 现在我将其转换为 html tsod to html 我怎样才能将其保存为文件 最好另存为 html 文件 with open my file html w as fo fo write tsod t
  • 在 Azure databricks 中创建外部表

    我是 azure databricks 的新手 并尝试创建一个外部表 指向 Azure Data Lake Storage ADLS Gen 2 位置 在 databricks 笔记本中 我尝试设置 ADLS 访问的 Spark 配置 我仍
  • 将 google-cloud 与 webpack 集成时遇到问题

    我正在将 google cloud npm 包与我的 React 应用程序集成 并且我正在使用 firebase 我遇到的错误 google cloud hash stream validation index js 模块中的警告 未找到
  • 使用新身份验证方法的 Symfony 简单登录表单不起作用

    我在设置新的 symfony 应用程序时遇到问题 我确信它与新的基于身份验证器的安全系统有关 我安装了一个新的 symfony 应用程序 版本 5 3 6 安装安全包composer require symfony security bun
  • C 中的逻辑运算符

    我在尝试理解逻辑运算符在 C 中的工作原理时遇到了困难 我已经了解位级运算符的工作原理 而且我还知道逻辑运算符将非零参数视为代表 TRUE 将零参数视为代表 FALSE 但是假设我们有 0x65 0x55 我不明白这个操作为什么以及如何给出
  • Skype 在 imo.im 和 im+ 服务中如何工作?

    Skype 在 imo im 和 im 服务中如何工作 有什么猜测吗 我认为只有3个办法 为服务器上的每个连接客户端运行多个 Skype 客户端副本 从 Skype Kit 为服务器上的每个客户端运行多个运行时副本 Skype协议的逆向工程
  • LINQ GroupBy 连续时间

    假设我有一个如下所示的简单结构 public class Range public DateTime Start get set public DateTime End get set public Range DateTime start