webForumDet fria alternativet

Bästa sättet att ta bort rader från en datatable?

.NET

5 svar · 523 visningar · startad av Lukaspojken

Medlem sedan maj 20011 312 inlägg
Frågan#1

Anta att vi har en datatable med cirka 200 rader. I denna datatable finns en kolumn som heter TypeCode. Det jag vill är att på ett effektivt sätt ta bort alla TypeCode som inte är lika med "Container". Hur gör man detta på bästa sätt?

Kom gärna med förslag på en bättre lösning än den nedan. För det borde väl finnas andra bättre sätt att göra detta på än att loopa, eller?

DtaData.DefaultView.RowFilter = "TypeCode <> 'Container'"
For Each item As DataRowView In DSData.DefaultView
                    item.Row.Delete()
Next
Medlem sedan dec. 19996 721 inlägg
#2

Nej, det finns inget annat sätt. En datatable är ingen databas, och bör inte användas som en.

Du kan ju alltid använda en DataView med RowFilter = "TypeCode = 'Container'".

Medlem sedan maj 20011 312 inlägg
#3

Dessa tre varianter har jag kommit fram till. Tredje alternativet kan jag tänka är bra att använda sig av om vi det är stora datamängder. Jag ska göra en liten prestanda test för att se lite hur det ser ut. Återkommer om jag kommer fram till något...

For Each item As DataRow In DtaData.Select("TypeCode <> 'Container'")
item.Row.Delete()
Next

DtaData.DefaultView.RowFilter = "TypeCode <> 'Container'"
For Each item As DataRowView In DSData.DefaultView
item.Row.Delete()
Next

DtaData.DefaultView.RowFilter = "TypeCode = 'Container'"
DtaContainers = DtaData.DefaultView.Table

For LoopCounter = 0 To DtaData.Rows.Count - 1
If DtaData.Rows(LoopCounter)("TypeCode") <> "Container" Then
DtaData.Rows(LoopCounter).Delete()
End if
Next

Medlem sedan dec. 19996 721 inlägg
#4

Måste du verkligen radera raderna? En DataView med RowFilter = "TypeCode = 'Container'" borde väl räcka?

Medlem sedan maj 20011 312 inlägg
#5

Så här blev här blev resultatet av prestandatestet. Testet gjordes i C#. Antal i datatable:n var 2000 rader. Testet gjordes också med 20000 men det blev samma resultat. Medelvärdet ökade bara på alla...

Slutsatsen är att använda enkel for-loop för att radera rader och inte rowfilter.

        **/\*ETTA - medelvärde 6 ms (Bäst i test)**
         \* for (int i = 0; i \< AbsenceData.Rows.Count; i++)
        {
            if (AbsenceData.Rows*\["Id"\].ToString() == "10")
            {
                AbsenceData.Rows*.Delete();
            }
        }\*/

        **/\*TVÅA - medelvärde 15,6 ms**
         \* foreach (DataRow item in AbsenceData.Select("Id = 10"))
        {
            item.Delete();
        }\*/

        **/\*TREA - medelvärde 81,1 ms**
         \* DataTable tmpDT = new DataTable();
        AbsenceData.DefaultView.RowFilter = "Id = 10";
        tmpDT = AbsenceData.DefaultView.Table;\*/

        **/\*FYRA - medelvärde 102,3 ms (Sämst i test)**
         \* AbsenceData.DefaultView.RowFilter = "Id = 10";
        foreach (DataRowView item in AbsenceData.DefaultView)
        {
            item.Row.Delete();
        }\*/**
Medlem sedan aug. 20003 575 inlägg
#6

Det hade varit intressant att veta hur det hade gått om det hade gällt fler parametrar än 1.

262 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
120 ms — deklarationer (db)
0 ms — hämta statistik (cache)
135 ms — hämta tråd, inlägg och bilagor (db)
124 ms — ändringar (db)