C# 在C中按日期时间值合并对象#

C# 在C中按日期时间值合并对象#,c#,C#,我有一个C#中的对象列表,具有“BeginDate”和“EndDate”日期时间属性。当一个对象的开始日期与前一个对象的结束日期在24小时内匹配时,我需要创建这些对象的新列表,并合并所有对象,返回到中断时间超过24小时为止 比如说。我有一份这样的清单 BeginDate EndDate Object 1 12/21/2017 01/20/2018 Object 2 12/01/2017 12/21/2017 Object 3 10/25/2

我有一个C#中的对象列表,具有“BeginDate”和“EndDate”日期时间属性。当一个对象的开始日期与前一个对象的结束日期在24小时内匹配时,我需要创建这些对象的新列表,并合并所有对象,返回到中断时间超过24小时为止

比如说。我有一份这样的清单

            BeginDate    EndDate
Object 1    12/21/2017   01/20/2018
Object 2    12/01/2017   12/21/2017
Object 3    10/25/2017   12/01/2017
Object 4    09/17/2017   10/25/2017
Object 5    08/01/2017   09/02/2017
Object 6    06/25/2017   07/26/2017
Object 7    04/20/2017   06/25/2017
这需要变成这样的列表

            BeginDate    EndDate
Object 1    09/17/2017   01/20/2018
Object 2    08/01/2017   09/02/2017
Object 3    4/20/2017    07/26/2017
如果对象表示正在进行的项目,那么EndDate可能是空值,这一事实进一步加剧了我的问题。那么最初的开发人员选择使用DateTime?键入,而不是该字段的常规日期时间值。所以你可能会有这样的情况

            BeginDate    EndDate
Object 1    12/21/2017   null
Object 2    12/01/2017   12/21/2017
必须将其转换为

            BeginDate    EndDate
Object 1    12/01/2017   null

现在,我正在尝试这个方法,但它并没有完全整合所有对象:

for (var index = 0; index < ProjectList.Count; index++)
{
  Project_BL ThisProject = ProjectList[index];
  Project_BL nextProject = ProjectList[index + 1];
  if (index + 1 < ProjectList.Count && ProjectList[index+1] != null)
  {
    DateTime TempEndDate = nextProject.EndDate ?? DateTime.Now;
    TimeSpan DifferenceBetweenProjectsTimespan =
      ThisProject.BeginDate.Subtract(TempEndDate);
    int DifferenceBetweenProjects = (int)DifferenceBetweenProjectsTimespan.TotalHours;
    if (DifferenceBetweenProjects <= 24)
    {                             
      if (IsLongProject == true)
      {
        nextProject.ProjectNature = "Long-term";
      }
      nextProject.EndDate = ThisProject.EndDate;
      ProjectList.RemoveAt(index);                            
      continue;
    }
    else
    {
      ProjectList.Add(ThisProject);
      index++;
      continue;
    }
  }
  else
  {
    ProjectList.Add(ThisProject);
  }
}

return ProjectList;
for(var index=0;index
使用系统;
使用System.Collections.Generic;
使用System.Linq;
公共课程
{
公共静态void Main()
{
var projectList=新列表
{
新项目{Name=“Object 1”,BeginDate=new DateTime(2017,12,21),EndDate=new DateTime(2018,01,20)},
新项目{Name=“Object 2”,BeginDate=new DateTime(2017,12,01),EndDate=new DateTime(2017,12,21)},
新项目{Name=“Object 3”,BeginDate=new DateTime(2017,10,25),EndDate=new DateTime(2017,12,01)},
新项目{Name=“Object 4”,BeginDate=new DateTime(2017,09,17),EndDate=new DateTime(2017,10,25)},
新项目{Name=“Object 5”,BeginDate=new DateTime(2017,08,01),EndDate=new DateTime(2017,09,02)},
新项目{Name=“Object 6”,BeginDate=new DateTime(2017,06,25),EndDate=new DateTime(2017,07,26)},
新项目{Name=“Object 7”,BeginDate=new DateTime(2017,04,20),EndDate=new DateTime(2017,06,25)},
};
var newList=新列表();
而(projectList.Count>0)
{
var item=projectList.ElementAt(0);
项目列表。删除(项目);
新建列表。添加(项);
//控制台写入线(项目);
变量匹配=匹配(项目、项目列表);
while(匹配!=null)
{
//Console.WriteLine(“匹配:+match.ToString());
项目列表。删除(匹配);
item.BeginDate=item.BeginDatematch.EndDate?item.EndDate:match.EndDate;
item.IsLongTerm=true;
//Console.WriteLine(“已调整:+item.ToString());
匹配=匹配(项目、项目列表);
}
}
foreach(新列表中的var项目)
{
Console.WriteLine(project.ToString());
}
}
私有静态项目匹配(项目项目,IEnumerable项目)
{
var result=projects.FirstOrDefault(p=>
(project.BeginDate.AddDays(-1)
结果:

对象1 2017-09-17 2018-01-20

对象5 2017-08-01 2017-09-02

对象6 2017-04-20 2017-07-26

使用系统;
使用System.Collections.Generic;
使用System.Linq;
公共课程
{
公共静态void Main()
{
var projectList=新列表
{
新项目{Name=“Object 1”,BeginDate=new DateTime(2017,12,21),EndDate=new DateTime(2018,01,20)},
新项目{Name=“Object 2”,BeginDate=new DateTime(2017,12,01),EndDate=new DateTime(2017,12,21)},
新项目{Name=“Object 3”,BeginDate=new DateTime(2017,10,25),EndDate=new DateTime(2017,12,01)},
新项目{Name=“Object 4”,BeginDate=new DateTime(2017,09,17),EndDate=new DateTime(2017,10,25)},
新项目{Name=“Object 5”,BeginDate=new DateTime(2017,08,01),EndDate=new DateTime(2017,09,02)},
新项目{Name=“Object 6”,BeginDate=new DateTime(2017,06,25),EndDate=new DateTime(2017,07,26)},
新项目{Name=“Object 7”,BeginDate=new DateTime(2017,04,20),EndDate=new DateTime(2017,06,25)},
};
var newList=新列表();
而(projectList.Count>0)
{
var item=projectList.ElementAt(0);
项目列表。删除(项目);
新建列表。添加(项);
//控制台写入线(项目);
变量匹配=匹配(项目、项目列表);
while(匹配!=null)
{
//Console.WriteLine(“匹配:+match.ToString());
项目列表。删除(匹配);
item.BeginDate=item.BeginDatematch.EndDate?item.EndDate:match.EndDate;
item.IsLongTerm=true;
//Console.WriteLine(“已调整:+item.ToString());
for (var index = 0; index < ProjectList.Count; index++)
{
  Project_BL ThisProject = ProjectList[index];
  Project_BL nextProject = ProjectList[index + 1];
  if (index + 1 < ProjectList.Count && ProjectList[index+1] != null)
  {
    DateTime TempEndDate = nextProject.EndDate ?? DateTime.Now;
    TimeSpan DifferenceBetweenProjectsTimespan =
      ThisProject.BeginDate.Subtract(TempEndDate);
    int DifferenceBetweenProjects = (int)DifferenceBetweenProjectsTimespan.TotalHours;
    if (DifferenceBetweenProjects <= 24)
    {                             
      if (IsLongProject == true)
      {
        nextProject.ProjectNature = "Long-term";
      }
      nextProject.EndDate = ThisProject.EndDate;
      ProjectList.RemoveAt(index);                            
      continue;
    }
    else
    {
      ProjectList.Add(ThisProject);
      index++;
      continue;
    }
  }
  else
  {
    ProjectList.Add(ThisProject);
  }
}

return ProjectList;
using System;
using System.Collections.Generic;
using System.Linq;

public class Program
{
    public static void Main()
    {
        var projectList = new List<Project>
        {
            new Project{Name = "Object 1", BeginDate = new DateTime(2017,12,21), EndDate = new DateTime(2018,01,20)},
            new Project{Name = "Object 2", BeginDate = new DateTime(2017,12,01), EndDate = new DateTime(2017,12,21)},
            new Project{Name = "Object 3", BeginDate = new DateTime(2017,10,25), EndDate = new DateTime(2017,12,01)},
            new Project{Name = "Object 4", BeginDate = new DateTime(2017,09,17), EndDate = new DateTime(2017,10,25)},
            new Project{Name = "Object 5", BeginDate = new DateTime(2017,08,01), EndDate = new DateTime(2017,09,02)},
            new Project{Name = "Object 6", BeginDate = new DateTime(2017,06,25), EndDate = new DateTime(2017,07,26)},
            new Project{Name = "Object 7", BeginDate = new DateTime(2017,04,20), EndDate = new DateTime(2017,06,25)},
        };

        var newList = new List<Project>();

        while(projectList.Count > 0)
        {
            var item = projectList.ElementAt(0);
            projectList.Remove(item);
            newList.Add(item);

            //Console.WriteLine(item);

            var match = Match(item, projectList);

            while (match != null)
            {
                //Console.WriteLine("match: " + match.ToString());
                projectList.Remove(match);
                item.BeginDate = item.BeginDate < match.BeginDate ? item.BeginDate : match.BeginDate;
                item.EndDate = item.EndDate > match.EndDate ? item.EndDate : match.EndDate;
                item.IsLongTerm = true;
                //Console.WriteLine("adjusted: " + item.ToString());

                match = Match(item, projectList);
            }
        }

        foreach(var project in newList)
        {
            Console.WriteLine(project.ToString());
        }
    }

    private static Project Match(Project project, IEnumerable<Project> projects)
    {
        var result = projects.FirstOrDefault(p => 
            (project.BeginDate.AddDays(-1) < p.BeginDate && p.BeginDate < project.EndDate.AddDays(1) )
            || (project.BeginDate.AddDays(-1) < p.EndDate && p.EndDate < project.EndDate.AddDays(1)) );

        return result;
    }
}

public class Project
{
    public string Name { get; set; }
    public DateTime BeginDate { get; set; }
    public DateTime EndDate { get; set; }
    public bool IsLongTerm { get; set; }
    public override string ToString()
    {
        return Name + " " + BeginDate.ToString("yyyy-MM-dd") + " " + EndDate.ToString("yyyy-MM-dd");
    }
}
public class Project
{
    public Project(string name, DateTime beginDate) : this(name, beginDate, null) { }
    public Project(string name, DateTime beginDate, DateTime? endDate)
    {
        Name = name;
        BeginDate = beginDate;
        EndDate = endDate;
    }

    public string Name { get; set; }
    public DateTime BeginDate { get; set; }
    public DateTime? EndDate { get; set; }

    public override string ToString()
    {
        return $"{Name}:\t{BeginDate.ToShortDateString()}\t:\t{(EndDate.HasValue ? EndDate.Value.ToShortDateString() : "Present")}";
    }
}
private static List<Project> Consolidate(List<Project> projects)
{
    var result = new List<Project>();

    // if empty return
    if (!projects.Any()) return result;

    // adding first project to a new list
    // and removing it from the main list
    result.Add(projects.First());
    projects.Remove(projects.First());

    // loop over all projects in the main list
    projects.ForEach(p =>
    {
        var endDate = p.EndDate.HasValue ? p.EndDate.Value : DateTime.Today;

        // checking if any of the projects in the new list
        // starts within 24 hours of the end date of the
        // current project
        if (result.Any(r => r.BeginDate >= endDate && r.BeginDate.Subtract(endDate) <= TimeSpan.FromDays(1) && r.Name != p.Name))
        {
            // if you find any get it
            var match = result.First(r => r.BeginDate >= endDate && r.BeginDate.Subtract(endDate) <= TimeSpan.FromDays(1) && r.Name != p.Name);
            var index = result.IndexOf(match);
            // create new project that consalidate both projects
            result[index] = new Project(match.Name, p.BeginDate, match.EndDate);
        }
        else
        {
            // if didn't find any add the current 
            // project to the new list
            result.Add(p);
        }
    });

    return result;
}
P6: 4/20/2017   :   7/26/2017
P5: 8/1/2017    :   9/2/2017
P1: 9/17/2017   :   1/20/2018

P6: 4/20/2017   :   Present
P5: 8/1/2017    :   9/2/2017
P4: 9/17/2017   :   Present
P1: 10/25/2017  :   1/20/2018
IEnumerable<Project> Consolidate(IEnumerable<Project> data) {
    // I need to create a new list of these objects with all the objects 
    //consolidated when the BeginDate of one object matches the EndDate 
    //of the previous one within 24 hours, going back until there is a break longer than 24 hours.
    using (var e = data.GetEnumerator()) {
        if (e.MoveNext()) {
            var previous = e.Current;
            while (e.MoveNext()) {
                var next = e.Current;
                if (previous.BeginDate.AddDays(-1) > next.EndDate) {
                    yield return previous;
                    previous = next;
                    continue;
                }
                previous = new Project {
                    BeginDate = next.BeginDate,
                    EndDate = previous.EndDate ?? DateTime.Now
                };
            }
            yield return previous;
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;

public class Program
{
    public static void Main()
    {
        var projectList = new List<Project>
        {
            new Project{Id = "Object 0", BeginDate = new DateTime(2018,01,20), EndDate = null},
            new Project{Id = "Object 1", BeginDate = new DateTime(2017,12,21), EndDate = new DateTime(2018,01,20)},
            new Project{Id = "Object 2", BeginDate = new DateTime(2017,12,01), EndDate = new DateTime(2017,12,21)},
            new Project{Id = "Object 3", BeginDate = new DateTime(2017,10,25), EndDate = new DateTime(2017,12,01)},
            new Project{Id = "Object 4", BeginDate = new DateTime(2017,09,17), EndDate = new DateTime(2017,10,25)},
            new Project{Id = "Object 5", BeginDate = new DateTime(2017,08,01), EndDate = new DateTime(2017,09,02)},
            new Project{Id = "Object 6", BeginDate = new DateTime(2017,06,25), EndDate = new DateTime(2017,07,26)},
            new Project{Id = "Object 7", BeginDate = new DateTime(2017,04,20), EndDate = new DateTime(2017,06,25)},
        };

        var resultsList = new List<Project>();
        var previousProject = new Project();
        var currentProject = new Project();

        foreach(var p in projectList.OrderBy(p => p.BeginDate))
        {
            if (string.IsNullOrEmpty(previousProject.Id))
            {
                previousProject = currentProject = p;
                continue;
            }

            if (p.BeginDate.AddDays(-1)<=previousProject.EndDate)
            {
                currentProject.EndDate = p.EndDate;
                previousProject = currentProject;
                continue;
            }
            else
            {
                resultsList.Add(currentProject);
                previousProject = currentProject = p;
            }
        }
        resultsList.Add(currentProject);

        foreach(var p in resultsList)
        {
            var endDate = p.EndDate?.ToString("yyyy-MM-dd");
            Console.WriteLine("{0}\t{1}\t{2}", p.Id, p.BeginDate.ToString("yyyy-MM-dd"), ((string.IsNullOrEmpty(endDate))?"Null":endDate));
        }
    }
}

public class Project
{
    public string Id { get; set; }
    public DateTime BeginDate { get; set; }
    public DateTime? EndDate { get; set; }
}