2

リスト内のデータを手動で検証しようとしています。

私はMachineryRecordクラスを持っており、それをJobNumberで並べ替えてからグループ化します。次に、グループ化された各リストで、時間の重複がある結果を見つける必要があります。開始時刻から終了時刻までが別のレコードの開始時刻から終了時刻と重複しています。

これまでのところ、これは私が持っているものです:

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

開始時刻が常に終了時刻よりも前であると仮定すると、 2 つの間隔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 ステートメントに簡略化できます。

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 に答える