【问题标题】:Remove matched Rows from two Datatable C# ( performance optimize)从两个 Datatable C# 中删除匹配的行(性能优化)
【发布时间】:2013-05-18 20:37:09
【问题描述】:

这里有两个DataTable

  • dtTotalDateRangeExcludeSundays
  • dtAbsentsLeavesHolidaysWorks

每个都有 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 循环需要时间

【问题讨论】:

    标签: asp.net performance c#-4.0 datatable


    【解决方案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)
    

    【讨论】:

    • 感谢您的及时回复,请您详细解释一下,这里datatable数据具有不同的时间跨度,dtAbsentsLeavesHolidaysWorks是随机顺序
    • 添加了一个示例伪代码(非常基本的解释了这个想法)。您必须让两个 DataTables 按日期排序才能工作。
    • 谢谢,但我不认为Delete from TotalDateRangeExcludeSundays where Date in (Select date from AbsentsLeavesHolidaysWorks) 这会起作用,因为那里的数据表是运行时根据某些条件生成的,将尝试你的第一个选项 n +1 ,也想知道使用LinQ有什么窍门吗??
    • 您也可以使用 Linq,但不会获得任何性能。代码会更好。
    猜你喜欢
    • 2015-08-06
    • 2016-10-06
    • 1970-01-01
    • 2014-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-13
    • 2010-09-09
    相关资源
    最近更新 更多