2012-01-25 3 views
5

ho DataTable con le seguenti colonne:Elimina riga dalla datatable dove prima colonna non contiene (una stringa)

ClientID date numberOfTransactions price 

ClientID è di tipo stringa e devo garantire che i suoi contenuti includono "A-" e "N6" per ogni valore nella tabella.

ho bisogno di eliminare tutte le righe della DataTable in cui questa prima colonna (ClientID) non contiene sia "A-" e "N6" (alcuni totali e altri dati non necessari). Come posso selezionare ed eliminare queste righe specificamente dal DataTable?

So che questo:

foreach (DataRow row in table.Rows) // Loop over the rows. 
    { 

     //Here should come part "if first column contains mentioned values 
    } 

so anche questo

If (string.Contains("A-") == true && string.Contains("N6") == true) 

{ 
//Do something 
} 

Ho bisogno di aiuto come implementare questo per prima colonna di ogni riga.

+1

Che query hai provato ..? anche quale DataBase stai usando SQL Server, MYSQL ecc ...? – MethodMan

+0

Questa domanda è troppo vaga; ci dà maggiori dettagli, per favore –

+1

Credo che l'OP voglia solo rimuovere alcuni DataRows dalla collezione DataTable.Rows (in memoria), quindi sapere da dove provengono i dati potrebbe essere irrilevante (da qui la sua confusione). –

risposta

6

Prova questo:

EDIT: incasinato che ultima riga, quindi se si è tentato esso, provalo ora che ho fatto non stupido. =)

List<int> IndicesToRemove = new List<int>(); 
DataTable table = new DataTable(); //Obviously, your table will already exist at this point 
foreach (DataRow row in table.Rows) 
{ 
    if (!(row["ClientID"].ToString().Contains("A-") && row["ClientID"].ToString().Contains("N6"))) 
     IndicesToRemove.Add(table.Rows.IndexOf(row)); 
} 
IndicesToRemove.Sort(); 
for (int i = IndicesToRemove.Count - 1; i >= 0; i--) table.Rows.RemoveAt(IndicesToRemove[i]); 
+0

Eccellente! Grazie mille! –

2

provare a utilizzare questo,

assumendo dt come oggetto Datatabe e ClientID come prima colonna (quindi utilizzando ItemArray [0])

for(int i=0; i<dt.Rows.Count; i++) 
{ 
    temp = dt.Rows[i].ItemArray[0].ToString(); 

if (System.Text.RegularExpressions.Regex.IsMatch(temp, "A-", System.Text.RegularExpressions.RegexOptions.IgnoreCase) || System.Text.RegularExpressions.Regex.IsMatch(temp, "N6", System.Text.RegularExpressions.RegexOptions.IgnoreCase)) 
    { 
    dt.Rows.RemoveAt(i); 
    i--; 
    } 
} 

soluzione avanti semplice e dritto. .. spero che aiuti

+1

Se lo fai in questo modo, non rischierai di saltare le righe durante l'iterazione? Diciamo i = 2 e trovi una riga che deve essere rimossa. Rimuovi la riga (2) che regola tutti gli indici delle altre righe, ma ora i = 3, quindi il ** nuovo ** (2) non è stato valutato, giusto? –

+0

D'accordo, rimuovendo da una raccolta mentre lo itera attraverso causerà i problemi. – Chris

+0

@ C.Barlow, hai ragione. errore mio. ho dimenticato di aggiungere un'altra riga che era: "io--;" Questo è tutto. – Bravo

2

questo dovrebbe essere più efficiente, sia nelle righe di codice e tempo, prova questo :)

for(int x=0; x<table.Rows.Count;) 
{ 
    if (!table.Rows[x].ItemArray[0].contains("A-") && !table.Rows[x].ItemArray[0].contains("N6")) 
     table.Rows.RemoveAt(x); 
    else x++; 
} 

Felice Coding

1

Prefazione: C.Barlow's existing answer è impressionante, questo è solo un altro percorso che qualcuno potrebbe prendere.

questo è un modo per farlo in cui non devi mai anello tutto il percorso attraverso la tabella originale (sfruttando il metodo DataTable.Select()):

DataTable table = new DataTable(); // This would be your existing DataTable 
// Grab only the rows that meet your criteria using the .Select() method 
DataRow[] newRows = table.Select("ClientID LIKE '%A-%' AND ClientID LIKE '%N6%'"); 
// Create a new table with the same schema as your existing one. 
DataTable newTable = table.Clone(); 
foreach (DataRow r in newRows) 
{ 
    // Dump the selected rows into the table. 
    newTable.LoadDataRow(r.ItemArray, true); 
} 

e ora avete un DataTable solo le righe che vuoi Se necessario, a questo punto, si potrebbe cancellare la tabella originale e sostituirlo con il contenuto del nuovo:

table.Clear(); 
table = newTable.Copy(); 


Edit: ho pensato a un ottimizzazione della memoria di ieri sera, si può solo sovrascrivere la tabella esistente una volta che hai le righe che ti servono, il che evita la necessità della tabella temporanea.

DataTable table = new DataTable(); // This would be your existing DataTable 
// Grab only the rows that meet your criteria using the .Select() method 
DataRow[] newRows = table.Select("ClientID LIKE '%A-%' AND ClientID LIKE '%N6%'"); 
// Clear out the old table 
table.Clear(); 
foreach (DataRow r in newRows) 
{ 
    // Dump the selected rows into the table. 
    table.LoadDataRow(r.ItemArray, true); 
} 
+1

Bello! +1 per efficienza ed essere generalmente impertinenti! –

+0

@ C.Barlow Haha, perché grazie =) – jadarnel27