我有一个包含 DateTime 属性 DueDate
的对象集合。
我希望将这些对象分组以便
DueDate
属性都在一个小时内(不是同一小时本身,但在 60 分钟内)- 最少的组数(每个对象应该只出现在一个组中)。
我目前有这个,但它按小时数分组,而不是 60 分钟:
var interval = new TimeSpan(1, 0, 0); // 1 hour
var groupedByDueDateHour in from job in jobs
group job by job.DueDate.Value.Ticks / interval.Ticks
into g
select g)
如何按时间窗分组以产生最少数量的组?
最佳答案
蛮力方法,可能有更优雅的 Linq 解决方案,但这似乎是正确的
public class Job
{
public int ID { get; set; }
public string Name { get; set; }
public DateTime DueDate { get; set; }
}
// You need to have this list ordered by DueDate....
List<Job> myJobs = new List<Job>
{
new Job{ID = 6, Name = "Job6", DueDate = new DateTime(2019,11,6,0,0,0)},
new Job{ID = 7, Name = "Job7", DueDate = new DateTime(2019,11,6,0,0,0)},
new Job{ID = 1, Name = "Job1", DueDate = new DateTime(2019,11,6,12,52,0)},
new Job{ID = 2, Name = "Job2", DueDate = new DateTime(2019,11,6,13,51,0)},
new Job{ID = 3, Name = "Job3", DueDate = new DateTime(2019,11,6,14,50,0)},
new Job{ID = 4, Name = "Job4", DueDate = new DateTime(2019,11,6,15,49,0)},
};
Dictionary<int, List<Job>> grouped = new Dictionary<int, List<Job>>();
foreach (Job j in myJobs)
{
int key = j.DueDate.Hour * 60 + j.DueDate.Minute;
if(key == 0) key = -1; // for distinguish jobs due at midnight.
int v = grouped.Keys.FirstOrDefault(k => (key - k) <= 60);
if (v == 0)
grouped.Add(key, new List<Job>(new Job[] { j}));
else
grouped[v].Add(j);
}
这应该返回一个字典,其中每个键都是从午夜开始的 DueDate 分钟数,每个值都是从键开始的 60 分钟范围内的作业列表
用你的真实数据进行测试
关于c# - 将对象分组到一段时间内以产生最小组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58731771/