【问题标题】:Merge two List into One With Splitting Overlaps According to Priority C#将两个列表合并为一个,根据优先级 C# 拆分重叠
【发布时间】:2019-12-06 18:52:03
【问题描述】:

我将这两个列表安排为优先级 1 并注册为优先级 0:

结果应该是:

我想将两个列表合并为一个具有检查优先级的列表。将输入优先行而不进行拆分。但是可以拆分不优先的行。

【问题讨论】:

  • 发布一些您目前尝试过的代码。
  • 您说“以优先级 1 计划并以优先级 0 注册”然后“可以拆分未优先级的行” - 是什么使行“未优先级”?所有行都有一个优先级,在您的数据中为 0 或 1。
  • @NetMage 我会说优先行是优先级值为 1 的行。但对于发帖者:你的问题有两个部分,首先是提出一个算法你想做什么,第二个是用 C# 编写。假设这是一个作业,你应该自己想出算法,并尝试自己实现它,只有当你卡在这部分时才在这里寻求帮助。
  • 您好 NetMage,计划的始终具有第一优先级。您的代码在许多情况下都有效。但是我发现了一种无法正常工作的情况。 CheckThisLink
  • 嗨@NetMage,我还有一个问题。你能不能也帮我一下 - Problem Link

标签: c# algorithm sorting merge split


【解决方案1】:

假设 Scheduled 包含所有优先级为 1 的句点,而 Registered 包含所有优先级为 0 的句点(这些被认为是无优先级),并假设您的句点属于名为 ClassPeriod 的类并假设PriorityNullable 来表示结果图中的空白列(您的问题应该已经清楚地回答了所有这些问题),那么您可以在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);

【讨论】:

  • 您好 NetMage,您的代码非常好。但它在一种情况下失败了。请帮助我。检查此Working Code Link。我已经创建了场景并写下了应该得到的结果。
  • @kapilkumar 在您的示例中,注册的 9 To 9.10 和 9.10 To 9.15 发生了什么?他们被丢弃了吗?
  • @kapilkumar 我修改了我的答案以在注册期间完全重叠计划期间时处理拆分注册期间。现在更复杂了。
  • 感谢您的代码。它工作得很好。你是救世主。非常感谢。
  • 嗨@NetMage,我又遇到了一个问题。你能帮我解决这个问题吗?Problem Link
猜你喜欢
  • 2017-10-24
  • 1970-01-01
  • 1970-01-01
  • 2015-08-23
  • 1970-01-01
  • 1970-01-01
  • 2020-01-07
  • 2022-11-15
  • 2016-01-08
相关资源
最近更新 更多