Удаление повторов в DataTable - Visual Basic .NET
Формулировка задачи:
Здравствуйте!
Имею таблицу в 2 столбца. Хочу удалить строки, в которых имеются одинаковые значения в первом столбце (у меня он называется Names).
Накидал вот такую функцию, она работает, но медленно. Наверняка есть способ быстрее и красивее. Подскажите, пожалуйста.
Листинг программы
- 'Функция, сжимающая таблицы и убирающая из них повторы по первому столбцу с названием Names
- Private Function CropeArr(ByVal Arr As System.Data.DataTable) As System.Data.DataTable
- Dim o As Integer = 0
- Dim d(0) As Long
- Dim Hs As New HashSet(Of String)
- 'Первый цикл. Пробегаем по всем строкам в таблице и пытаемся добавить в хэшсет значения из столбца Names
- 'Если не получается (т.е. такое значение уже есть) - добавляем индекс строки в массив
- For Each eRow As System.Data.DataRow In Arr.Rows
- If Hs.Add(eRow!Names) = False Then
- Array.Resize(d, d.Count + 1)
- d(d.GetUpperBound(0)) = Arr.Rows.IndexOf(eRow)
- End If
- Next
- 'Второй цикл. По всем индексам в созданном в предыдущем цикле массиве удаляем строку с нужным индексом.
- 'Поскольку, с каждым удалением номера следующих строк уменьшаются на 1, добавляем переменную. которая компенсирует это уменьшение
- For Each sD In d
- Arr.Rows(sD - o).Delete()
- o = o + 1
- Next
- Hs.Clear()
- Return Arr
- End Function
Решение задачи: «Удаление повторов в DataTable»
textual
Листинг программы
- Private Sub Button5_Click(sender As System.Object, e As System.EventArgs) Handles Button5.Click
- Dim tb As DataTable = CreateTabl()
- DataGridView1.DataSource = CropeArr(tb)
- End Sub
- Private Function CropeArr(ByVal Arr As System.Data.DataTable) As System.Data.DataTable
- 'в таблице Arr два поля Фамилия и Дата
- Dim tbb = Arr.AsEnumerable().Distinct(New rComp)
- Dim tb As New DataTable
- tb.Columns.Add("Фамилия", System.Type.GetType("System.String"))
- tb.Columns.Add("Дата", System.Type.GetType("System.DateTime"))
- For Each r As DataRow In tbb
- tb.Rows.Add(r.ItemArray)
- Next
- Return tb
- End Function
- Private Class rComp : Implements IEqualityComparer(Of DataRow)
- Public Overloads Function Equals(ByVal b1 As DataRow, ByVal b2 As DataRow) _
- As Boolean Implements IEqualityComparer(Of DataRow).Equals
- Dim bb As Boolean
- If String.Compare(b1.Item(0), b2.Item(0)) = 0 Then bb = True
- Return bb
- End Function
- Public Overloads Function GetHashCode(ByVal bx As DataRow) _
- As Integer Implements IEqualityComparer(Of DataRow).GetHashCode
- Dim hCode As Integer = bx(0).GetHashCode
- Return hCode.GetHashCode()
- End Function
- End Class
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д