39 votes

DataTable, Comment supprimer conditionnellement des lignes

Je suis engagée dans un C# processus d'apprentissage et il va bien pour l'instant. J'ai juste maintenant touché mon premier "say what?" moment.

La DataTable offre aléatoire de l'accès aux lignes à ses Lignes collection, non seulement à travers typique des collections de comportement, mais aussi à travers la DataTable.Sélectionnez. Cependant je ne peux pas semblent être en mesure de lier cette capacité à DataRow.Supprimer. Jusqu'à présent c'est ce qu'il semble-je faire pour conditionnellement à supprimer une ou plusieurs lignes d'une table.

int max = someDataTable.Rows.Count - 1;
for(int i = max; i >= 0; --i)
{
    if((int)someDataTable.Rows[i].ItemArray[0] == someValue)
    {
        someDataTable.Rows[i].BeginEdit();
        someDataTable.Rows[i].Delete();
    }
    else
        break;
}
someDataTable.AcceptChanges();

Mais je ne suis pas heureux avec ce code. Ni, j'en suis convaincue. Quelque chose doit m'échapper. Suis-je vraiment obligé de frapper les Lignes de la collection de manière séquentielle si j'ai besoin de supprimer une ou plusieurs lignes conditionnellement?

(n'ayez pas l'esprit de la inversée pour. Je suis à la suppression de la fin de la datatable. Donc c'est ok)

75voto

Matthew Whited Points 12255

Vous pouvez interroger l'ensemble de données, puis boucler les lignes sélectionnées pour les définir comme supprimées.

 var rows = dt.Select("col1 > 5");
foreach (var row in rows)
    row.Delete();
 

... et vous pouvez également créer des méthodes d'extension pour le rendre plus facile ...

 myTable.Delete("col1 > 5");

public static DataTable Delete(this DataTable table, string filter)
{
    table.Select(filter).Delete();
    return table;
}
public static void Delete(this IEnumerable<DataRow> rows)
{
    foreach (var row in rows)
        row.Delete();
}
 

44voto

Alain Points 10079

Voici une ligne unique utilisant LINQ et évitant toute évaluation au moment de l'exécution de chaînes sélectionnées:

 someDataTable.Rows.Cast<DataRow>().Where(
    r => r.ItemArray[0] == someValue).ToList().ForEach(r => r.Delete());
 

9voto

itsmatt Points 18905

Je n'ai pas de boîte Windows à portée de main pour essayer cela, mais je pense que vous pouvez utiliser un DataView et faire quelque chose comme ça:

 DataView view = new DataView(ds.Tables["MyTable"]);
view.RowFilter = "MyValue = 42"; // MyValue here is a column name

// Delete these rows.
foreach (DataRowView row in view)
{
  row.Delete();
}
 

Je n'ai cependant pas testé cela. Vous pourriez essayer.

0voto

gev Points 29

Même si la réponse de M Whited a le plus de votes, construisez table.Select (filter) .Delete () qu'il recommande n'est pas disponible car Delete () n'est pas membre de System.Array.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X