Kopieren DataTable.Zeilen DataRow[]. Schneller Weg, dann Wählen Sie() mit der gleichen Funktionalität?

Habe ich jetzt ein problem mit einem sehr alten system von uns. (!Es ist mehr als 7 Jahre alt und ich habe kein budget und Ressourcen, um größere Veränderung in der Struktur, so dass die Entscheidung zur Verbesserung der alten Logik so viele, wie wir können.!)

Haben wir einen eigenen geschrieben gridcontrol. Im Grunde ist es wie ein normales ASP.NET raster, können Sie hinzufügen, ändern, löschen von Elementen.

Das problem ist, dass das raster hat eine BindGrid() - Methode, wobei für die weitere Nutzung, die Zeilen aus der datasource-Tabelle kopiert, in eine DataRow[]. Ich brauche, um die DataRow[], aber ich möchte zu implementieren, der beste Weg, um eine Kopie der Quelle, aus der die Tabelle in das array.

Die aktuelle Lösung:

DataRow[] rows = DataSource.Select("1=1", SortOrderString);

Wie ich es bisher erlebt, wenn ich brauche, um einen angegebenen Art, das könnte der beste Weg sein (ich bin auch interessiert, wenn es einen schnelleren Weg, oder nicht).

ABER es gibt einige vereinfachte Seiten, wo die SortOrder ist nicht erforderlich.

So konnte ich an zwei stellen eine Methode für die Sortierung und eine für ohne.
Das eigentliche problem ist die zweite:

 DataRow[] rows = DataSource.Select("1=1");

Weil es sehr langsam. Ich machte einige Tests, und es ist Art von 15 mal langsamer dann die CopyTo () - Lösung:

DataRow[] rows = new DataRow[DataSource.Rows.Count];
DataSource.Rows.CopyTo(rows,0);

Möchte ich der schnellere Weg, ABER wenn ich die tests, einige alte Funktion einfach abgestürzt. Es scheint, es gibt noch einen anderen Unterschied, was ich erst jetzt bemerkt:
Die Select() liefert die Zeilen wie die RowChanges akzeptiert werden.

Also, wenn ich gelöscht eine Reihe, und ich glaube nicht, verwenden Sie die AcceptRowChanges() (ich kann das nicht tun, leider), dann mit Select("1=1") die Zeile ist in der DataSource aber nicht in der DataRow[].

Mit einem einfachen .CopyTo() die Zeile ist da, und das ist eine schlechte Nachricht für mich.

Meine Fragen sind:

1) Auswählen("1=1") der beste Weg, um die Zeilen nach dem RowChanges? (Ich bezweifle ein wenig, denn es ist wie der 6-jährige Teil)

2) Und wenn 1) nicht, ist es möglich, auf eine schnellere Weise, mit dem gleichen Ergebnis als die .Auswählen("1=1") ?

UPDATE:

Hier ist eine sehr einfache test-app, was ich für speedtesting:

DataTable dt = new DataTable("Test");

dt.Columns.Add("Id", typeof (int));
dt.Columns.Add("Name", typeof(string));

for (int i = 0; i < 10000; i++)
{
    DataRow row = dt.NewRow();
    row["ID"] = i;
    row["Name"] = "Name" + i;
    dt.Rows.Add(row);
}

dt.AcceptChanges();
DateTime start = DateTime.Now;

DataRow[] rows = dt.Select();

/*DataRow[] rows = new DataRow[dt.Rows.Count];
dt.Rows.CopyTo(rows,0);*/

Console.WriteLine(DateTime.Now - start);
  • Sie können rufen Sie Select ohne argument: DataRow[] allRows = DataSource.Select(); Das wäre sicher effizienter als "1=1" da gilt sinnlose RowFilter. Ein anderer Weg ist mit Linq-To-DataSet zu bestellen und filtern Sie die DataTable. Das ist nicht effizienter, aber besser lesbar und maintanable.
  • Und ist das schneller? Wenn ja, können Sie eine Antwort geben, mit etwas Erklärung, ich bin neugierig!
Schreibe einen Kommentar