2012-12-13 50 views
2

我想對列表中的數據做一些手動驗證。C#Linq查詢來查找無效條目

我有一個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查詢來實現這一目標?

感謝您的幫助。

+1

是什麼格式時間?你爲什麼使用浮動?它是24小時制嗎?你能展示開始和結束時間的樣本嗎? – RAS

+0

對不起,忘了說StartTime和EndTime是從類似於汽車裏程表的機器中的計數器中獲取的,但是要計算使用的小時數。因此,使用float的時間 – Anthbs

回答

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語句。

return !_machineRecords.Any(a => 
      _machineRecords.Any(b => 
       (a.ID != b.ID) && 
       (a.JobNumber == b.JobNumber) && 
       (a.StartTime < b.EndTime) && 
       (a.EndTime > b.StartTime))); 
+0

這有一個小錯誤,當檢查相同的MachineRecord時,它返回true。我將如何修改這個來解決這個問題? – Anthbs

+0

哈哈,你修復它,因爲我張貼感謝您的幫助:) – Anthbs

+0

已經解決 - 只是比較ID或參考'a!= b'。 –

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; 
    } 

我還沒有測試,但它;)