zoukankan      html  css  js  c++  java
  • 合并重叠时间段C#

    1、实际业务中,存在以下使用场景:

    不同的开始、结束时间,需要合并其中的重叠部分。

    例如:

    StartTime EndTime
    06:10:58 08:15:28
    07:38:56 10:34:45
    10:55:00 11:34:00
    13:09:34 17:45:23
    14:23:12 15:24:14
    16:14:25 17:52:15
    ...
    合并后为:
    StartTime EndTime
    06:10:58 10:34:45
    10:55:00 11:34:00
    13:09:34 17:52:15
    ...

    2、查阅资料,找到如下处理办法(C#):

    首先把数据读入DataTable dt里,然后

     static void CombineData()
            {
                DataTable dt = new DataTable();
                dt.Columns.Add(new DataColumn("StartTime", Type.GetType("System.DateTime")));
                dt.Columns.Add(new DataColumn("EndTime", Type.GetType("System.DateTime")));

                DataRow row = dt.NewRow();
                row[0] = DateTime.Parse("06:10:58");
                row[1] = DateTime.Parse("08:15:28");
                dt.Rows.Add(row);

                row = dt.NewRow();
                row[0] = DateTime.Parse("07:38:56");
                row[1] = DateTime.Parse("10:34:45");
                dt.Rows.Add(row);

                row = dt.NewRow();
                row[0] = DateTime.Parse("10:55:00");
                row[1] = DateTime.Parse("11:34:00");
                dt.Rows.Add(row);

                row = dt.NewRow();
                row[0] = DateTime.Parse("13:09:34");
                row[1] = DateTime.Parse("17:45:23");
                dt.Rows.Add(row);

                row = dt.NewRow();
                row[0] = DateTime.Parse("14:23:12");
                row[1] = DateTime.Parse("15:24:14");
                dt.Rows.Add(row);

                row = dt.NewRow();
                row[0] = DateTime.Parse("16:14:25");
                row[1] = DateTime.Parse("17:52:15");
                dt.Rows.Add(row);

                for (int i = dt.Rows.Count - 1; i >= 1; i--)
                {
                    //从后往前判断
                    if (Convert.ToDateTime(dt.Rows[i - 1]["EndTime"].ToString()) > Convert.ToDateTime(dt.Rows[i]["StartTime"].ToString()) && Convert.ToDateTime(dt.Rows[i - 1]["EndTime"].ToString()) < Convert.ToDateTime(dt.Rows[i]["EndTime"].ToString()))
                    {
                        dt.Rows[i - 1]["EndTime"] = dt.Rows[i]["EndTime"];
                        dt.Rows.RemoveAt(i);
                    }
                    else if (Convert.ToDateTime(dt.Rows[i - 1]["EndTime"].ToString()) > Convert.ToDateTime(dt.Rows[i]["StartTime"].ToString()) && Convert.ToDateTime(dt.Rows[i - 1]["EndTime"].ToString()) > Convert.ToDateTime(dt.Rows[i]["EndTime"].ToString()))
                    {
                        dt.Rows.RemoveAt(i);
                        i++;
                    }
                }

                foreach (DataRow r in dt.Rows)
                {
                    Console.WriteLine(r[0].ToString()+" "+r[1].ToString());
                }
                Console.ReadLine();
            }

     3、参考资料

    http://bbs.csdn.net/topics/360064136

    http://blog.csdn.net/hcw_peter/article/details/3980723

  • 相关阅读:
    用位运算实现十进制转换为二进制
    【Zhejiang University PATest】02-3. 求前缀表达式的值
    【Zhejiang University PATest】02-1. Reversing Linked List
    【Tsinghua OJ】隧道(Tunel)问题
    冒泡排序及其优化
    有序向量的查找算法
    【Tsinghua OJ】灯塔(LightHouse)问题
    有序向量的去重算法
    【Tsinghua OJ】祖玛(Zuma)问题
    倒水问题(《怎样解题》中的经典问题)
  • 原文地址:https://www.cnblogs.com/panxiaoming/p/6725348.html
Copyright © 2011-2022 走看看