Как удалить все дубликаты в таблице данных в vb.net ?

#vb.net

#vb.net

Вопрос:

Рассмотрим мою таблицу данных

 ID Name
1  AAA
2  BBB
3  CCC
1  AAA
4  DDD
  

Конечный результат

 2 BBB
3 CCC
4 DDD
  

Как я могу удалить строки в таблице данных с помощью Vb.Net
Приветствуется любая помощь.

Комментарии:

1. Каков источник этих данных?

2. Что такое дубликат, строка с тем же именем или строка с тем же именем и идентификатором?

Ответ №1:

Следующее работает, если вам нужны только отдельные строки (пропустите строки с одинаковым идентификатором и именем):

 Dim distinctRows = From r In tbl
       Group By Distinct = New With {Key .ID = CInt(r("ID")), Key .Name = CStr(r("Name"))} Into Group
       Where Group.Count = 1
       Select Distinct
' Create a new DataTable containing only the unique rows '
Dim tblDistinct = (From r In tbl
       Join distinctRow In tblDistinct
       On distinctRow.ID Equals CInt(r("ID")) _
       And distinctRow.Name Equals CStr(r("Name"))
       Select r).CopyToDataTable
  

Если вы хотите удалить дубликаты из исходной таблицы:

 Dim tblDups = From r In tbl
       Group By Dups = New With {Key .ID = CInt(r("ID")), Key .Name = CStr(r("Name"))} Into Group
       Where Group.Count > 1
       Select Dups
Dim dupRowList = (From r In tbl
       Join dupRow In tblDups
       On dupRow.ID Equals CInt(r("ID")) _
       And dupRow.Name Equals CStr(r("Name"))
       Select r).ToList()

For Each dup In dupRowList 
    tbl.Rows.Remove(dup)
Next
  

Вот ваш образец-данные:

 Dim tbl As New DataTable
tbl.Columns.Add(New DataColumn("ID", GetType(Int32)))
tbl.Columns.Add(New DataColumn("Name", GetType(String)))
Dim row = tbl.NewRow
row("ID") = 1
row("Name") = "AAA"
tbl.Rows.Add(row)
row = tbl.NewRow
row("ID") = 2
row("Name") = "BBB"
tbl.Rows.Add(row)
row = tbl.NewRow
row("ID") = 3
row("Name") = "CCC"
tbl.Rows.Add(row)
row = tbl.NewRow
row("ID") = 1
row("Name") = "AAA"
tbl.Rows.Add(row)
row = tbl.NewRow
row("ID") = 4
row("Name") = "DDD"
tbl.Rows.Add(row)
  

Ответ №2:

Вы можете использовать DefaultView.Итоговый метод DataTable для выполнения фильтрации следующим образом:

  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
  

Комментарии:

1. ты герой!!

2. Отличный ответ, единственной частью вашей реализации, которую я пропустил, была часть клонирования. Если бы это был мой вопрос, я бы отметил это как ответ, хорошего дня! (:

3. Рад, что это полезно. Метод Clone в основном копирует структуру без строк, поэтому в этом случае переменной присваивается новая пустая таблица данных, а затем в нее импортируются строки.

Ответ №3:

Предполагая, что вы хотите проверить все столбцы, это должно удалить дубликаты из DataTable (DT):

         DT = DT.DefaultView.ToTable(True, Array.ConvertAll((From v In DT.Columns Select v.ColumnName).ToArray(), Function(x) x.ToString()))
  

Если я не упустил это из виду, этого, похоже, нет в документации (DataView.ToTable Метод), но это также, по-видимому, делает то же самое:

 DT = DT.DefaultView.ToTable(True)