2012-01-25 9 views
5

tengo DataTable con las siguientes columnas:Eliminar fila de tabla de datos en la primera columna no contiene (un trozo de cuerda)

ClientID date numberOfTransactions price 

ClientID es de tipo cadena y necesito para asegurar que sus contenidos incluyen "A-" y "N6" para cada valor en la tabla.

Necesito eliminar todas las filas del DataTable donde esta primera columna (ClientID) no contiene "A-" y "N6" (algunos totales y otros datos innecesarios). ¿Cómo puedo seleccionar y eliminar estas filas específicamente de DataTable?

sé esto:

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

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

también sé esta

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

{ 
//Do something 
} 

Necesito ayuda cómo implementar esto para la primera columna de cada fila.

+1

¿Qué consulta ha intentado ...? también, ¿con qué base de datos está utilizando SQL Server, MYSQL, etc.? – MethodMan

+0

Esta pregunta es demasiado vaga; nos da más detalles, por favor –

+1

Creo que el OP solo quiere eliminar ciertos DataRows de la colección DataTable.Rows (en la memoria), por lo que saber de dónde provienen los datos podría ser realmente irrelevante (de ahí su confusión). –

Respuesta

6

Prueba esto:

EDIT: en mal estado totalmente hasta que la última línea, por lo que se lo probase, probarlo ahora que lo hice no es tonta. =)

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

¡Excelente! ¡Muchas gracias! –

2

tratar de usar esto,

suponiendo dt como su objeto Datatabe y ClientID como su primera columna (de ahí el uso de 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--; 
    } 
} 

solución simple y directo. .. espero que ayude

+1

Si lo haces de esta manera, ¿no te arriesgas a saltar filas durante tu iteración? Digamos que i = 2 y encuentras una fila que necesita ser eliminada. Se elimina la fila (2) que ajusta los índices de todas las demás filas, pero ahora i = 3, por lo que ** ** ** (2) no se evaluó, ¿verdad? –

+0

De acuerdo, eliminar de una colección mientras se itera a través de ella causará problemas. – Chris

+0

@ C.Barlow, tienes razón. mi error. Olvidé agregar una línea más que era: "yo--;" Eso es. – Bravo

2

esto debería ser más eficiente, tanto en líneas de código como de tiempo, intente esto :)

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++; 
} 

feliz Codificación

1

Prefacio: C.Barlow's existing answer es impresionante, esto es sólo otra ruta que alguien podría tomar.

Esta es una manera de hacerlo en el que nunca tiene que bucle de todo el camino a través de la tabla original (tomando ventaja del método 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); 
} 

Y ahora usted tiene una DataTable sólo las filas que quieres Si es necesario, en este punto se podía limpiar la tabla original y reemplazarlo con el contenido de la nueva:

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


Editar: pensé en una optimización de la memoria de anoche, sólo puede sobrescribir la tabla existente una vez que tenga las filas que necesita, lo que evita la necesidad de la tabla temporal.

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

¡Agradable! +1 por eficiencia y por lo general atrevido! –

+0

@ C.Barlow Jaja, porque gracias =) – jadarnel27

Cuestiones relacionadas