Quel est le meilleur moyen de supprimer les doublons d'une table?
J'ai vérifié l'ensemble du site et cherché sur le net, mais a été incapable de trouver une solution simple à ce problème.
J'ai un datatable qui a environ 20 colonnes et 10K lignes. J'ai besoin de supprimer les lignes en double dans ce datatable basé sur 4 colonnes de clé. Ne fait pas .Net ont une fonction qui fait cela? La fonction la plus proche de ce que je recherche a été datatable.DefaultView.ToTable(true, tableau de colonnes à afficher), Mais cette fonction ne distincts sur tous les colonnes.
Ce serait génial si quelqu'un pouvait m'aider avec cela.
EDIT: je suis désolé de ne pas être clair sur ce point. Cette datatable est en cours de création par la lecture d'un fichier CSV et non pas à partir d'une base. Donc à l'aide d'une requête SQL n'est pas une option.
OriginalL'auteur Khaja Minhajuddin | 2008-12-04
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser Linq to jeux de données. Vérifier cette. Quelque chose comme ceci:
OriginalL'auteur Eduardo Campañó
Comment puis-je supprimer les doublons de lignes?. (Ajuster la requête pour le rejoindre sur votre 4 colonnes de clé)
EDIT: avec vos nouvelles informations, je crois que le plus simple serait de mettre en œuvre IEqualityComparer<T> et l'utilisation Distinctes sur vos lignes de données. Sinon, si vous travaillez avec IEnumerable/IList au lieu de DataTable/DataRow, il est certainement possible avec certains LINQ-to-objets de kung-fu.
EDIT: exemple IEqualityComparer
Vous pouvez l'utiliser comme ceci:
OriginalL'auteur liggett78
Si vous avez accès à Linq je pense que vous devriez être en mesure d'utiliser le construit en fonction groupe sur le en mémoire de collecte et de choisir les lignes en double
De recherche Google pour Linq Groupe par les exemples
Lire la modifier dans la question. Ce n'est pas Sql
OriginalL'auteur terjetyl
Il doit être pris en compte dans ce Tableau.AcceptChanges() doit être appelée pour terminer la suppression. Sinon supprimé la ligne est toujours présent dans la DataTable avec RowState ensemble Supprimé. Et De La Table.Les lignes.Le comte n'est pas modifié après la suppression.
OriginalL'auteur Alexey
Je pense que ce doit être la meilleure façon de supprimer les doublons Datatable en utilisant
Linq
etmoreLinq
Code:
Linq
Article Du Blog : Supprimer les Doublons de lignes enregistrements à partir de la DataTable Asp.net c#
MoreLinq
Remarque:
moreLinq
besoin d'ajouter de la bibliothèque.Dans morelinq vous pouvez utiliser la fonction appelée DistinctBy dans laquelle vous pouvez spécifier la propriété sur laquelle vous voulez trouver des objets Distincts.
Article du Blog : À l'aide de moreLinq DistinctBy méthode pour supprimer les enregistrements en double
OriginalL'auteur Satinder singh
Liggett78 la réponse est beaucoup mieux - esp. que la mienne avait une erreur! Correction comme suit...
OriginalL'auteur
Trouvé ceci sur bytes.com:
Qui vous permettra d'accéder à vos données via des requêtes sql, comme d'autres ont proposé.
OriginalL'auteur Treb
"Ce datatable est en cours de création par la lecture d'un fichier CSV et non pas à partir d'une base."
De façon à mettre une contrainte unique sur les quatre colonnes dans la base de données, et les inserts sont des doublons sous votre conception n'irai pas. Sauf s'il décide de l'échec plutôt que de le faire lorsque cela arrive, mais ce n'est sûrement configurable dans votre fichier CSV importer le script.
OriginalL'auteur JeeBee
Utiliser une requête au lieu de fonctions:
OriginalL'auteur Samiksha
C'est un code très simple ne nécessitant pas de linq, ni des colonnes individuelles pour faire le filtre.
Si toutes les valeurs des colonnes dans une rangée sont nulles, il sera supprimé.
Cela peut même être utilisé pour supprimer des données nulles à partir d'une feuille excel.
OriginalL'auteur Srikanth V M
Essayer cette
Considérons dtInput est votre tableau de données avec les enregistrements en double.
J'ai un nouveau DataTable dtFinal dans laquelle je veux filtrer les lignes en double.
Donc mon code sera quelque chose comme ci-dessous.
OriginalL'auteur Suhas Patil
Je n'étais pas chaud à l'idée à l'aide de Linq solution ci-dessus j'ai donc écrit ceci:
En outre, cela fonctionne sur TOUTES les colonnes plutôt qu'un index de colonne:
OriginalL'auteur Dave Lucre