求时间段的交集

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class Default7 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        List<KeyValuePair<DateTime, DateTime>> timeSegments1 = new List<KeyValuePair<DateTime, DateTime>>();
        timeSegments1.Add(new KeyValuePair<DateTime, DateTime>(DateTime.Parse("2015-11-21 8:00:00"), DateTime.Parse("2015-11-21 9:00:00")));
        timeSegments1.Add(new KeyValuePair<DateTime, DateTime>(DateTime.Parse("2015-11-21 9:30:00"), DateTime.Parse("2015-11-21 10:00:00")));
        timeSegments1.Add(new KeyValuePair<DateTime, DateTime>(DateTime.Parse("2015-11-21 10:30:00"), DateTime.Parse("2015-11-21 12:00:00")));

        List<KeyValuePair<DateTime, DateTime>> timeSegments2 = new List<KeyValuePair<DateTime, DateTime>>();
        timeSegments2.Add(new KeyValuePair<DateTime, DateTime>(DateTime.Parse("2015-11-21 8:30:00"), DateTime.Parse("2015-11-21 9:20:00")));
        timeSegments2.Add(new KeyValuePair<DateTime, DateTime>(DateTime.Parse("2015-11-21 9:30:00"), DateTime.Parse("2015-11-21 10:40:00")));

        var objs = GetUnionTime(timeSegments1, timeSegments2);
        int count = 1;
        foreach (var item in objs)
        {
            Response.Write(string.Format("{2} 开始时间:{0} 结束时间:{1}<br/>", item.Key, item.Value, count));
            count++;
        }
    }

    private KeyValuePair<DateTime, DateTime>? GetUnioTimeSegment(
        DateTime fromTime1, DateTime toTime1, DateTime fromTime2, DateTime toTime2)
    {
        if (fromTime1 >= toTime1 || fromTime2 >= toTime2)
            throw new Exception("时间大小违反规则,出现了开始时间比结束时间大的情况!");

        KeyValuePair<DateTime, DateTime>? resultTimeSegment = null;

        //1包含2
        if (fromTime1 <= fromTime2 && toTime2 <= toTime1 )
        {
            resultTimeSegment = new KeyValuePair<DateTime, DateTime>(fromTime2, toTime2);
        }
        //2包含1
        if (fromTime2 < fromTime1 && toTime1 <= toTime2 )
        {
            resultTimeSegment = new KeyValuePair<DateTime, DateTime>(fromTime1, toTime1);
        }

        //12交叉,1左,2右
        if (fromTime1 <= fromTime2 && fromTime2 <= toTime1 && toTime1 <= toTime2 )
        {
            resultTimeSegment = new KeyValuePair<DateTime, DateTime>(fromTime2, toTime1);
        }

        //21交叉,2左,1右
        if (fromTime2 <= fromTime1 && fromTime1 <= toTime2 && toTime2 <= toTime1 )
        {
            resultTimeSegment = new KeyValuePair<DateTime, DateTime>(fromTime1, toTime2);
        }

        return resultTimeSegment;
    }

    private KeyValuePair<DateTime, DateTime>? GetUnioTimeSegment(
        KeyValuePair<DateTime, DateTime> timeSegment1, KeyValuePair<DateTime, DateTime> timeSegment2)
    {
        return GetUnioTimeSegment(timeSegment1.Key, timeSegment1.Value, timeSegment2.Key, timeSegment2.Value);
    }

    private List<KeyValuePair<DateTime, DateTime>> GetUnionTime(
        List<KeyValuePair<DateTime, DateTime>> timeSegments1, List<KeyValuePair<DateTime, DateTime>> timeSegments2)
    {
        List<KeyValuePair<DateTime, DateTime>> resultTimeSegments = new List<KeyValuePair<DateTime, DateTime>>();

        foreach (KeyValuePair<DateTime, DateTime> timeSegment1 in timeSegments1)
        {
            foreach (KeyValuePair<DateTime, DateTime> timeSegment2 in timeSegments2)
            {
                KeyValuePair<DateTime, DateTime>? timeSegment = GetUnioTimeSegment(timeSegment1, timeSegment2);
                if (timeSegment.HasValue)
                    resultTimeSegments.Add(timeSegment.Value);
            }
        }

        return resultTimeSegments;
    }
}
时间: 2024-10-10 08:09:59

求时间段的交集的相关文章

A、B两个整数集合,设计一个算法求他们的交集

代码留作记录,本人水平有限,看了别人的解法真是自愧不如. 关于此题的详细探讨可以参考:http://blog.csdn.net/thebestdavid/article/details/12056293 /*A.B两个整数集合,设计一个算法求他们的交集,尽可能的高效.*/ #include <iostream> #include <cstring> #include <set> #define M 8 #define N 5 using namespace std; i

Silverlight项目笔记6:Linq求差集、交集&amp;检查网络连接状态&amp;重载构造函数复用窗口

一.使用Linq求差集.交集 使用场景: 需要从数据中心获得用户数据,并以此为标准,同步系统的用户信息,对系统中多余的用户进行删除操作,缺失的用户进行添加操作,对信息更新了的用户进行编辑操作更新. 所以需要通过对数据中心以及系统现有用户信息进行比较,分为三部分: (1) Linq取差集,找出需要删除的用户数据,进行删除(USERNAME为唯一值字段). 使用的是Except这个方法. (2)使用Linq提供的Intersect方法,取得两个用户集合的交集,遍历检查进行更新. (3)同样再次取差集

Java求字符串数组交集 并集 差集 去重复并集

//系统方法 package com; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class Test { public static void main(String[] args) { List list1 =new ArrayList(); list1.add("1111"); list1.add("2222"); list1.add

JAVA求字符串数组交集、并集和差集

1 package string; 2 3 import java.util.HashMap; 4 import java.util.HashSet; 5 import java.util.LinkedList; 6 import java.util.Map; 7 import java.util.Map.Entry; 8 import java.util.Set; 9 10 public class StringArray { 11 public static void main(String

利用快速排序求两集合交集

1.主程序 %% 求两个集合快速排序 tic arrayList1 = [49,38,65,97,76,13,27,49,100,67]; arrayList1 = quickSort(arrayList1,1,length(arrayList1)); arrayList2 = [49,34,76,27,23,566,67]; arrayList2 = quickSort(arrayList2,1,length(arrayList2)); %% 求两个集合交集: length_arrayList

求数组差/交集函数-php数组函数(二)

求数组差集函数 函数只检查了多维数组中的一维.可以用 array_diff($array1[0], $array2[0]) 检查更深的维度. u:自定义函数比较,a(association):同时比较键和值. 自定义函数callable $value_compare_func必须返回一个小于零,等于零,或大于零的整数.其中返回零代表两个数相等. 对比数组值的函数 array_diff 对比(===) array1,array2···的值(value),返回在 $array1 中但是不在其他 ar

python中列表之间求差集、交集、并集

求两个列表的交集.并集.差集 def diff(listA, listB): # 求交集的两种方式 retA = [i for i in listA if i in listB] retB = list(set(listA).intersection(set(listB))) print("retA is :", retA) print("retB is :", retB) # 求并集 retC = list(set(listA).union(set(listB))

数据结构实践——“求两集合交集”的一个错解分析

本文点评一位学生对基于线性表存储集合,然后对集合进行求并运算的错解,供学习者參考. [项目 - 求集合并集] 如果有两个集合 A 和 B 分别用两个线性表 LA 和 LB 表示,即线性表中的数据元素即为集合中的成员.设计算法.用函数unionList(List LA, List LB, List &LC )函数实现该算法,求一个新的集合C=A∪B.即将两个集合的并集放在线性表LC中. 提示: (1)除了实现unnionList函数外.还须要在main函数中设计代码,调用unionList进行測试

Linq 数据操作,两个数组求差、交集、并集

int[] a = { 1, 2, 3, 4, 5, 6, 7 }; int[] b = { 4, 5, 6, 7, 8, 9, 10 }; int[] c = { 1, 2, 3, 3, 4, 1, 2, 4, 6, 1, 6, 5 }; // 交集 var ** = a.Intersect(b); 4,5,6,7 // 并集 var ** = a.Union(b); 1,2,3,4,5,6,7,8,9,10 // a有b没有的 var diff1 = a.Except(b); 1,2,3,9