2

我正在尝试对列表中的数据进行一些手动验证。

我有一个 MachineryRecord 类,我对它进行排序,然后按 JobNumber 分组,现在我需要在每个具有重叠时间的分组列表中找到任何结果,例如。开始时间到结束时间与另一个记录 StartTime 到 EndTime 重叠。

到目前为止,这就是我所得到的:

int invalidCount = 0;
var sorted = _machineRecords.OrderBy(x => x.StartTime).ToList();
var grouped = sorted.GroupBy(x => x.JobNumber).ToList();
foreach(IGrouping<int,MachineryRecord> mac in grouped)     
{
   var queryResults = mac.//Linq query to find overlapping times
   invalidCount += queryResults.Count;
}
if(invalidCount > 0)
    return false;
else
    return true;

这是 MachineRecord 对象的缩减版本:

public class MachineryRecord
{
    public int ID { get; set; }
    public float StartTime { get; set; }
    public float EndTime { get; set; }
}

所以我的问题是实现这一目标的 linq 查询是什么?

谢谢您的帮助。

4

2 回答 2

3

如果并假设开始时间总是在结束时间之前,则两个间隔ab重叠。因此,这可以表示如下。a.StartTime < b.EndTimea.EndTime > b.StartTime

var invalidCount = _machineRecords.Count(a =>
                       _machineRecords.Any(b =>
                           (a.ID != b.ID) &&
                           (a.JobNumber == b.JobNumber) &&
                           (a.StartTime < b.EndTime) &&
                           (a.EndTime > b.StartTime)));

包括这个的最终检查invalidCount可以简化为单个返回语句。

return !_machineRecords.Any(a =>
           _machineRecords.Any(b =>
               (a.ID != b.ID) &&
               (a.JobNumber == b.JobNumber) &&
               (a.StartTime < b.EndTime) &&
               (a.EndTime > b.StartTime)));
于 2012-12-13T02:55:19.297 回答
0

这是一个非 LINQ 版本,它将使用集合按开始日期排序的事实:

    List<Tuple<MachineryRecord,MachineryRecord>> OverlapingRecords(IEnumerable<MachineryRecord> sortedRecords)
    {
        var result = new List<Tuple<MachineryRecord, MachineryRecord>>();
        MachineryRecord prev = null;
        foreach (var current in sortedRecords)
        {
            if (prev != null)
            {
                if (current.StartTime < prev.EndTime) { result.Add(new Tuple<MachineryRecord, MachineryRecord>(prev,current)); }
            }
            prev = current;
        }
        return result;
    }

我还没有测试过它;)

于 2012-12-13T04:57:17.887 回答