Quel est le meilleur moyen de supprimer les entrées en double d'une table de données?
Réponses
Trop de publicités? /* Pour éliminer les lignes en double */
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();
}
}
Rangées complètement distinctes :
public static DataTable Dictinct(this dt) => dt.DefaultView.ToTable(true);
Distinctes par des rangée(s) particulières (Notez que les colonnes mentionnées dans "distinctCulumnNames" seront renvoyées dans le DataTable résultant) :
public static DataTable Dictinct(this dt, params string[] distinctColumnNames) =>
dt.DefaultView.ToTable(true, distinctColumnNames);
Distinctes par une colonne particulière (préserve toutes les colonnes dans le DataTable donné) :
public static void Distinct(this DataTable dataTable, string distinctColumnName)
{
var distinctResult = new DataTable();
distinctResult.Merge(
.GroupBy(row => row.Field(distinctColumnName))
.Select(group => group.First())
.CopyToDataTable()
);
if (distinctResult.DefaultView.Count < dataTable.DefaultView.Count)
{
dataTable.Clear();
dataTable.Merge(distinctResult);
dataTable.AcceptChanges();
}
}
Vous pouvez utiliser la méthode DefaultView.ToTable d'un DataTable pour effectuer le filtrage de cette manière (adaptée en 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
'Construire la liste des colonnes
For Each pColumn In rDataTable.Columns
pColumnList.Add(pColumn.ColumnName)
Next
'Filtrer par toutes les colonnes
pNewDataTable = rDataTable.DefaultView.ToTable(True, pColumnList.ToArray)
rDataTable = rDataTable.Clone
'Importer les lignes dans la structure de table d'origine
For Each pCurrentRowCopy In pNewDataTable.Rows
rDataTable.ImportRow(pCurrentRowCopy)
Next
End Sub
Pour distinguer toutes les colonnes du tableau de données, vous pouvez facilement récupérer les noms des colonnes dans un tableau de chaînes
public static DataTable RemoveDuplicateRows(this DataTable dataTable)
{
List columnNames = new List();
foreach (DataColumn col in dataTable.Columns)
{
columnNames.Add(col.ColumnName);
}
return dataTable.DefaultView.ToTable(true, columnNames.Select(c => c.ToString()).ToArray());
}
Comme vous pouvez le constater, j'ai pensé l'utiliser en tant qu'extension de la classe DataTable
1 votes
Désolé de poster ma réponse à nouveau ici. Veuillez également consulter stackoverflow.com/a/24387929/815600