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'".
5 svar · 523 visningar · startad av Lukaspojken
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
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'".
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
Måste du verkligen radera raderna? En DataView med RowFilter = "TypeCode = 'Container'" borde väl räcka?
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();
}\*/**
Det hade varit intressant att veta hur det hade gått om det hade gällt fler parametrar än 1.