c# - 将对象分组到一段时间内以产生最小组

标签 c# linq grouping

我有一个包含 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/

相关文章:

c# - 比较可空值和空值

c# - “元素”是无效的 XmlNodeType

c# - 将服务引用添加到共享类的多个 WCF 服务

C# 如何在循环中组合一些 Linq 表达式

javascript - 对象数组到按属性分组的对象数组

java - 如何在 Java 8 中使用特定条件对列表列表进行分组

c# - .Net MVC4 重定向到操作未按预期工作

C# 如何使用 LINQ 获取特定列标题名称下的所有单元格数据

C#匿名类型从其他方法访问

algorithm - 分组算法 - 锦标赛