0

这里我有两个DataTable

  • dtTotalDateRangeExcludeSundays
  • dt缺席假期工作

每个都有 10k+ 值。我需要删除匹配的行。
下面的代码工作正常

foreach (DataRow rw in dtTotalDateRangeExcludeSundays.Select())
 {
    DateTime dateFromRange=Convert.ToDateTime(rw[0].ToString());
    string strPrnt = dateFromRange.ToShortDateString();
    foreach (DataRow row in dtAbsentsLeavesHolidaysWorks.Select())
    {
      DateTime getDate = Convert.ToDateTime(row[0].ToString());
      string strchild = getDate.ToShortDateString();
       if (strPrnt == strchild)
       {
          rw.Delete();
        }
       }
 }

想知道是否有更好的替代建议,Foreach当有大量数据时,因为循环需要时间

4

1 回答 1

1

您可以让两个 DataTables 按日期排序并同时将日期作为参考。

像这样的东西(伪代码):

var CurrDate = Datetime.MinDate;
while true {
   while (dtTotalDateRangeExcludeSundays[i].Date <= CurrDate) {
      i++
   }
   while (dtAbsentsLeavesHolidaysWorks[j].Date <= CurrDate) {
      j++
   }
   If (dtTotalDateRangeExcludeSundays[i].Date == dtAbsentsLeavesHolidaysWorks[j].Date) {
      // delete
   }
   CurrDate = Min( dtAbsentsLeavesHolidaysWorks[j].Date, dtAbsentsLeavesHolidaysWorks[j].Date )
}

您必须添加对超出范围的索引和其他安全措施的所有检查。你明白吗?

或者
您可以在一个 sql 语句中删除所有匹配的行(如果适用)

Delete from TotalDateRangeExcludeSundays where Date in (Select date from AbsentsLeavesHolidaysWorks)
于 2013-05-23T13:07:23.007 回答