c# - 根据优先级 C# 将两个列表合并为一个并拆分重叠
解决方案
假设Scheduled
包含所有优先级为 1 的周期,并且Registered
包含所有优先级为 0 的周期(这些被认为是unprioritized),并假设您的周期在一个名为的类中ClassPeriod
,并假设Priority
是 aNullable
代表结果图中的空白列(您的问题应该已经回答所有这些都清楚),那么您可以在以下位置定义一个辅助方法ClassPeriod
:
public class ClassPeriod {
public double From;
public double To;
public int? Priority;
public bool ContainsFrom(ClassPeriod aCP) => From <= aCP.From && aCP.From < To;
public bool ContainsTo(ClassPeriod aCP) => From < aCP.To && aCP.To <= To;
}
现在您可以将答案计算为:
var ans = Scheduled
.Select(s => new ClassPeriod { From = s.From, To = s.To })
.Concat(
Registered.SelectMany(r => {
var ans = new List<ClassPeriod>();
while (r.From < r.To) {
var pcp = new ClassPeriod {
From = Scheduled.Where(s => s.ContainsFrom(r)).Select(s => s.To).DefaultIfEmpty(r.From).Max(),
To = Scheduled.Where(s => s.ContainsTo(r)).Select(s => s.From).DefaultIfEmpty(r.To).Min()
};
var nexts = Scheduled.Where(s => pcp.ContainsFrom(s));
if (nexts.Any()) {
var nextTo = nexts.Min(s => s.From);
ans.Add(new ClassPeriod { From = pcp.From, To = nextTo });
r.From = nextTo;
}
else {
if (pcp.From < pcp.To)
ans.Add(pcp);
break;
}
}
return ans;
})
)
.OrderBy(cp => cp.From).ThenBy(cp => cp.To);
推荐阅读
- javascript - 在SAPUI5中,如何根据另一个表格设置表格列宽?
- heroku - 可以将 Heroku Postgres 的访问权限限制在 IP 白名单中吗?
- jquery - Django 的 AJAX 调用失败。无响应或错误消息
- blockchain - 我在仅使用 WAVES 创建智能资产交易时收到此错误“订单被资产脚本拒绝”,如何解决?
- algorithm - “顶级船体”是否有任何有效的算法?
- javascript - 加载脚本时修改 div 高度
- angular - 在 Angular 7+ 项目中同时使用 Sass (Scss) 和 Less
- php - Laravel PHP 7.3 pdo_mysql 报告缺少驱动程序,可能是由于 Ubuntu 上未定义的符号
- angular - 如何在 Angular 6 中解析 JSON
- javascript - 如何访问投影的任意 Angular 子组件中的方法
?