2011-11-16 72 views
1

我有一個DataTable具有以下結構。 起始日期(DateTime類型) 結束日期(DateTime類型) 描述(類型文本)使用LINQ排序數據表

我需要檢查是,如果日期重疊與否,也就是說,如果1項的開始日期小於的結束日期前一個項目。

這是我寫的代碼。

注:我已經有檢查,以確保每個記錄的開始日期必須是於結束日期

dtDates.DefaultView.Sort = "StartDate ASC"; //Sort the DataTable based on the Start Dates 
if(dtDates.Rows.Count > 1) //Check only if more than 1 Date is specified 
{ 
    for (int i = 1; i < dtDates.Rows.Count; i++) 
    { 
     if(TypeConvert.ToDate(dtDates.Rows[i]["StartDate"] < TypeConvert.ToDate(dtDates.Rows[i-1]["EndDate"]) 
      { 
       retVal = true; 
       currentRow = i; 
       break; 
      } 
    } 
} 

上面的代碼工作正常較小。

但現在,我想使用LINQ

所以,這裏是我想嘗試的代碼來實現它。

如何使用LINQ做整個比較?

public static bool CheckIfDatesOverlap(DataTable dataTable) 
    { 
     bool retVal = false; 
     int currentRow = 0; 
     List<DataRow> listDates = (from DataRow dgv in dataTable.Rows 
               select dgv).OrderBy(x => x[StartDate]).ToList(); 
     if (listDates.Count > 1) //Perform Comparision only if more than 1 row is present 
     { 
      for (int i = 1; i < listDates.Count; i++) 
      { 
       if (TypeConvert.ToDateTime(listDates[i][StartDate]) < TypeConvert.ToDateTime(listDates[i][EndDate])) 
       { 
        retVal = true; //There are duplicates, hence return true 
        currentRow = i; 
        break; 
       } 
       else 
       { 
        //Do nothing as dates do not overlap 
       } 
      } 
     } 
     else 
     { 
      retVal = false; //As there is only 1 row, return false 
     } 
     if (retVal) 
     { 
      string message = "Dates Overlap"; 
      //Display message 
     } 
     return retVal; 
    } 

回答

4

如果使用SelectWithPrevious描述here那麼你可以寫:

bool datesOverlap = table.Rows 
    .Cast<DataRow>() 
    .SelectWithPrevious((current, previous) => new 
     { 
      PreviousEndDate = (DateTime)previous["EndDate"], 
      StartDate = (DateTime)current["StartDate"] 
     }) 
    .Any(x => x.StartDate < x.PreviousEndDate); 
+0

喬恩斯基特罷工再次:)謝謝指點出來,這幫助了我很多,我猜這就是OP正在尋找的答案。 –