<html>
  <head>

    <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
  </head>
  <body text="#000000" bgcolor="#FFFFFF">
    Hi, I've never posted here before, so forgive me if I break
    etiquette. However, I'm trying to submit a suggestion for a code
    change. While developing our product which runs on both Windows and
    Linux, our Linux users reported a significant difference in speed
    between the application running on Windows under MS.NET versus Mono.
    I've tracked down the main cause of the problem and I thought I'd
    share my change for possible inclusion in a future release of Mono.<br>
    <br>
    This is the current code for DataRowCollection.RemoveInternal...<br>
    <br>
    <font face="Courier New, Courier, monospace">internal void
      RemoveInternal (DataRow row)<br>
      {<br>
          if (row == null)<br>
              throw new IndexOutOfRangeException ("The given datarow is
      not in the current DataRowCollection.");<br>
          int index = List.IndexOf (row);<br>
          if (index < 0)<br>
              throw new IndexOutOfRangeException ("The given datarow is
      not in the current DataRowCollection.");<br>
          List.RemoveAt (index);<br>
          for (; index < List.Count; ++index)<br>
              ((DataRow) List [index]).RowID = index;<br>
      }</font><br>
    <br>
    Using List.IndexOf(row) is causing the poor performance. However,
    DataRowCollection has its own IndexOf() method which is designed to
    be fast and safe, taking advantage of the cached RowID member and
    testing that the row is a member in the DataRowCollection. This
    should be used here instead, resulting in the following code
    change...<br>
    <br>
    <font face="Courier New, Courier, monospace">internal void
      RemoveInternal (DataRow row)<br>
      {<br>
          if (row == null)<br>
              throw new IndexOutOfRangeException ("The given datarow is
      not in the current DataRowCollection.");<br>
      -   int index = List.IndexOf (row);<br>
      +   int index = this.IndexOf (row);<br>
          if (index < 0)<br>
              throw new IndexOutOfRangeException ("The given datarow is
      not in the current DataRowCollection.");<br>
          List.RemoveAt (index);<br>
          for (; index < List.Count; ++index)<br>
              ((DataRow) List [index]).RowID = index;<br>
      }</font><br>
    <br>
    In my own testing this sped up row deletions by approximately 360%,
    but you can ascertain a more accurate measure for yourself.<br>
    <br>
    Thanks,<br>
    -Julian<br>
  </body>
</html>