Comparez et supprimer datatable ligne à l'aide de C#:
J'ai deux tables comme DTTable1 et DTTable2. Il a les registres suivants.
DTTable1:
ItemID Specification Amount
--------- --------------- ---------
1 A 10
1 B 20
1 C 30
DTTable1:
ItemID Specification Amount
--------- --------------- ---------
1 A 10
1 B 20
1 C 30
2 A 10
2 B 20
3 A 10
3 B 20
Ici je veux comparer ces deux tables. Si DTTable1 enregistrements présents dans DTTable2(ne considérer que ItemID) puis supprimer les lignes correspondantes qui a la ItemID même que DTTable1.
J'ai essayé foreach et forloop.
En Utilisant ForEach:
foreach (DataRow DR in DTTable2.Rows)
{
if (DR["ItemID"].ToString() == DTTable1.Rows[0]["ItemID"].ToString())
{
DTTable2.Rows.Remove(DR);
}
}
DTTable2.AcceptChanges();
Il a montré l'erreur,
"La Collection a été modifiée; l'énumération opération risque de ne pas exécuter". Je l'ai donc utilisé Pour la Boucle, Elle aussi n'est pas donné le résultat souhaité.
À L'Aide De La Boucle:
for (int i = 0; i < DTTable2.Rows.Count; i++)
{
if (DTTable2.Rows[i]["ItemID"].ToString() == DTTable1.Rows[0]["ItemID"].ToString())
{
DTTable2.Rows.RemoveAt(i);
}
}
DTTable2.AcceptChanges();
Mais parfois, la seconde ligne permet de ne pas supprimer de la table. Je reçois la finale de la DataTable que
ItemID Specification Amount
--------- --------------- ---------
1 B 20
2 A 10
2 B 20
3 A 10
3 B 20
Comment résoudre ce problème? Quelle est la méthode la plus simple pour faire cela?
OriginalL'auteur thevan | 2012-10-10
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas modifier une collection tout en vous énumérez dans votre premier exemple. En revanche, vous pouvez obtenir une liste des lignes à supprimer, puis sur supprimer.
Ou en ligne à l'aide de linq:
Votre deuxième exemple échoue car une fois qu'une ligne est supprimée, les indices de la ligne de changement, mais vous continuer d'augmenter
i
, ce qui saute au-dessus de la ligne qui suit immédiatement la ligne supprimée. Il y a deux façons de contourner cela:Ou
Note de côté: je me demande si vraiment vous dire de toujours comparer à la ligne 0 du données, compte tenu de votre description. Peut-être que vous vouliez comparer toutes les lignes comme suit à la place (bien que n'étant pas optimale du tout)?
OriginalL'auteur lc.
Essayez d'utiliser:
OriginalL'auteur Rover
Vous pouvez utiliser LINQ to DataTable:
OriginalL'auteur cuongle
Bien, les gars. J'ai eu presque la même situation et n'importe comment, j'ai essayé de le faire, je rencontrais des problèmes. Ma solution a été de ne pas essayer et de faire une boucle par la DataTable. J'ai fait un tableau à partir de la première DataTable (ce document contenait les lignes qui doivent être supprimés à partir de la deuxième DataTable). Boucle à travers le Tableau et utiliser un sélectionnez pour supprimer la ligne correspondant dans la DataTable. Puisqu'il n'était pas une boucle, et il peut correspondre à n'importe quelle ligne dans le DataTable, j'ai cessé d'avoir des erreurs.
Remarque: Original DataTable est un 1-tableau de la colonne qui contient ce que vous essayez de supprimer à partir de la deuxième Table de données en ligne (n'a pas d'importance combien de colonnes qu'il a). Remplacer "LinkName=' w/la colonne nom de la colonne 1 du tableau.
Renvoie le deuxième DataTable avec juste les lignes de gauche qui ne correspond pas à la valeur trouvée dans le premier DataTable.
OriginalL'auteur user1544428