Quelle est la meilleure façon de supprimer des entrées en double d'une table de données?Meilleure façon de supprimer des entrées en double d'une table de données
Répondre
Supprimer les doublons
public DataTable RemoveDuplicateRows(DataTable dTable, string colName)
{
Hashtable hTable = new Hashtable();
ArrayList duplicateList = new ArrayList();
//Add list of all the unique item value to hashtable, which stores combination of key, value pair.
//And add duplicate item value in arraylist.
foreach (DataRow drow in dTable.Rows)
{
if (hTable.Contains(drow[colName]))
duplicateList.Add(drow);
else
hTable.Add(drow[colName], string.Empty);
}
//Removing a list of duplicate items from datatable.
foreach (DataRow dRow in duplicateList)
dTable.Rows.Remove(dRow);
//Datatable which contains unique records will be return as output.
return dTable;
}
Liens Ci-dessous
http://www.dotnetspider.com/resources/4535-Remove-duplicate-records-from-table.aspx
http://www.dotnetspark.com/kb/94-remove-duplicate-rows-value-from-datatable.aspx
Pour supprimer les doublons dans la colonne
http://dotnetguts.blogspot.com/2007/02/removing-duplicate-records-from.html
: Comment puis-je le faire pour plusieurs colonnes. J'ai essayé d'inclure string [] colName.But Table.Rows.Remove (dRow); Lance une erreur comme "Le DataRow donné n'est pas dans le DataRowCollection en cours" .Veuillez suggérer. – user1495475
Vous devrez modifier le foreach de façon incrémentielle sur plusieurs niveaux. Cependant, utiliser Linq pourrait être plus facile. http://stackoverflow.com/questions/8939516/how-to-find-duplicate-record-using-linq-from-datatable – miracules
Le lien de dotnetspark a fonctionné pour moi, car je devais supprimer des lignes uniquement si les lignes de 2 colonnes correspondent . Cela ne fonctionne que pour un seul type, mais ça me va bien !! – DarkPh03n1X
Est-ce dtEmp
sur votre travail actuel DataTable:
DataTable distinctTable = dtEmp.DefaultView.ToTable(/*distinct*/ true);
Il est agréable.
Cette réponse mérite plus d'attention, était exactement ce dont j'avais besoin et beaucoup plus simple que la construction d'un hashtable/dictionnaire/quoi que ce soit tant que vous avez seulement besoin de filtrer les doublons exacts. – lee
Faites attention aux performances de cette solution. Dans mon implémentation, ToTable() était assez lent, prenant 30 fois plus de temps que la requête originale qui avait les données. –
Cet extrait de code est ce que je veux.simple et génial. –
Heres un moyen facile et rapide à l'aide AsEnumerable().Distinct()
private DataTable RemoveDuplicatesRecords(DataTable dt)
{
//Returns just 5 unique rows
var UniqueRows = dt.AsEnumerable().Distinct(DataRowComparer.Default);
DataTable dt2 = UniqueRows.CopyToDataTable();
return dt2;
}
Merci d'avoir posté votre réponse! Veuillez vous assurer de lire attentivement la [FAQ sur l'autopromotion] (http://stackoverflow.com/faq#promotion). Notez également qu'il est * obligatoire * que vous publiez une clause de non-responsabilité chaque fois que vous créez un lien vers votre propre site/produit. J'ajoute la divulgation pour vous ici; essayez de garder cela à l'esprit pour l'avenir! –
c'est très lent .. – LuckyS
Ce poste est seulement aller chercher en ce qui concerne les lignes de la table Services distincts de données sur la base de plusieurs colonnes.
Public coid removeDuplicatesRows(DataTable dt)
{
DataTable uniqueCols = dt.DefaultView.ToTable(true, "RNORFQNo", "ManufacturerPartNo", "RNORFQId", "ItemId", "RNONo", "Quantity", "NSNNo", "UOMName", "MOQ", "ItemDescription");
}
Vous devez appeler cette méthode et vous devez affecter une valeur à datatable. Dans le code ci-dessus, nous avons RNORFQNo, PartNo, ID RFQ, ItemId, RNONo, QUantity, NSNNO, UOMName, MOQ, et Description de l'article en tant que colonne sur laquelle nous voulons des valeurs distinctes.
Merci beaucoup. Aide vraiment :) Solution facile – Rebecca
/* To eliminate Duplicate rows */
private void RemoveDuplicates(DataTable dt)
{
if (dt.Rows.Count > 0)
{
for (int i = dt.Rows.Count - 1; i >= 0; i--)
{
if (i == 0)
{
break;
}
for (int j = i - 1; j >= 0; j--)
{
if (Convert.ToInt32(dt.Rows[i]["ID"]) == Convert.ToInt32(dt.Rows[j]["ID"]) && dt.Rows[i]["Name"].ToString() == dt.Rows[j]["Name"].ToString())
{
dt.Rows[i].Delete();
break;
}
}
}
dt.AcceptChanges();
}
}
Il existe un moyen simple d'utiliser la méthode Linq GroupBy.
var duplicateValues = dt.AsEnumerable()
.GroupBy(row => row[0])
.Where(group => (group.Count() == 1 || group.Count() > 1))
.Select(g => g.Key);
foreach (var d in duplicateValues)
Console.WriteLine(d);
Je suppose que vous n'avez pas besoin de grouper par count() == 1 ou vous obtiendrez toutes les lignes de toute façon. –
Une façon simple serait:
var newDt= dt.AsEnumerable()
.GroupBy(x => x.Field<int>("ColumnName"))
.Select(y => y.First())
.CopyToDataTable();
lignes complètement distinctes:
public static DataTable Dictinct(this dt) => dt.DefaultView.ToTable(true);
Distinct par ligne particulière (s) (Notez que les colonnes mentionnées dans "distinctCulumnNames" seront retournés dans résultant DataTable):
public static DataTable Dictinct(this dt, params string[] distinctColumnNames) =>
dt.DefaultView.ToTable(true, distinctColumnNames);
Distinct par colonne particulière (conserve toutes les colonnes DataTable donné):
public static void Distinct(this DataTable dataTable, string distinctColumnName)
{
var distinctResult = new DataTable().Merge(
dataTable.AsEnumerable()
.GroupBy(row => row.Field<object>(distinctColumnName))
.Select(group => group.First())
.CopyToDataTable()
);
if (distinctResult.DefaultView.Count < dataTable.DefaultView.Count)
{
dataTable.Clear();
dataTable.Merge(distinctResult);
dataTable.AcceptChanges();
}
}
Vous pouvez utiliser la DefaultView.ToTable méthode d'un DataTable pour faire le filtrage comme celui-ci (adapter à C#):
Public Sub RemoveDuplicateRows(ByRef rDataTable As DataTable)
Dim pNewDataTable As DataTable
Dim pCurrentRowCopy As DataRow
Dim pColumnList As New List(Of String)
Dim pColumn As DataColumn
'Build column list
For Each pColumn In rDataTable.Columns
pColumnList.Add(pColumn.ColumnName)
Next
'Filter by all columns
pNewDataTable = rDataTable.DefaultView.ToTable(True, pColumnList.ToArray)
rDataTable = rDataTable.Clone
'Import rows into original table structure
For Each pCurrentRowCopy In pNewDataTable.Rows
rDataTable.ImportRow(pCurrentRowCopy)
Next
End Sub
Hate pour publier à nouveau ma réponse ici. S'il vous plaît également jeter un oeil à http: // stackoverflow.com/a/24387929/815600 – Sandy