C# 在C中按日期时间值合并对象#
我有一个C#中的对象列表,具有“BeginDate”和“EndDate”日期时间属性。当一个对象的开始日期与前一个对象的结束日期在24小时内匹配时,我需要创建这些对象的新列表,并合并所有对象,返回到中断时间超过24小时为止 比如说。我有一份这样的清单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
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; }
}