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 sinnloseRowFilter
. Ein anderer Weg ist mitLinq-To-DataSet
zu bestellen und filtern Sie dieDataTable
. 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!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie anrufen
Select
ohne argument:DataRow[] allRows = DataSource.Select();
Das wäre sicher effizienter als"1=1"
da gilt sinnloseRowFilter
.Ein anderer Weg ist mit
Linq-To-DataSet
zu bestellen und filtern Sie dieDataTable
. Das ist nicht mehr effizient, aber besser lesbar und wartbar.Habe ich noch kein Beispiel oder Messung, aber es ist offensichtlich, dass eine
RowFilter
mit"1=1"
teurer ist als gar keine.Select
erfolgt in dieser Weise:Wenn Sie wollen, können wählen Sie auch die Zeilen, die derzeit nicht akzeptiert, können Sie die überlastung von
Select
:Dadurch werden alle Zeilen auswählen, einschließlich der Zeilen, die gelöscht werden, auch wenn
AcceptChanges
noch nicht aufgerufen wurde.DateTime.Now-start
für Sie? Auf meinem pc ist es nur00:00:00.0230013
(23 Millisekunden).