Удаление повторов в DataTable - Visual Basic .NET

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! Имею таблицу в 2 столбца. Хочу удалить строки, в которых имеются одинаковые значения в первом столбце (у меня он называется Names). Накидал вот такую функцию, она работает, но медленно. Наверняка есть способ быстрее и красивее. Подскажите, пожалуйста.
Листинг программы
  1. 'Функция, сжимающая таблицы и убирающая из них повторы по первому столбцу с названием Names
  2. Private Function CropeArr(ByVal Arr As System.Data.DataTable) As System.Data.DataTable
  3. Dim o As Integer = 0
  4. Dim d(0) As Long
  5. Dim Hs As New HashSet(Of String)
  6. 'Первый цикл. Пробегаем по всем строкам в таблице и пытаемся добавить в хэшсет значения из столбца Names
  7. 'Если не получается (т.е. такое значение уже есть) - добавляем индекс строки в массив
  8. For Each eRow As System.Data.DataRow In Arr.Rows
  9. If Hs.Add(eRow!Names) = False Then
  10. Array.Resize(d, d.Count + 1)
  11. d(d.GetUpperBound(0)) = Arr.Rows.IndexOf(eRow)
  12. End If
  13. Next
  14. 'Второй цикл. По всем индексам в созданном в предыдущем цикле массиве удаляем строку с нужным индексом.
  15. 'Поскольку, с каждым удалением номера следующих строк уменьшаются на 1, добавляем переменную. которая компенсирует это уменьшение
  16. For Each sD In d
  17. Arr.Rows(sD - o).Delete()
  18. o = o + 1
  19. Next
  20. Hs.Clear()
  21. Return Arr
  22. End Function

Решение задачи: «Удаление повторов в DataTable»

textual
Листинг программы
  1. Private Sub Button5_Click(sender As System.Object, e As System.EventArgs) Handles Button5.Click
  2.     Dim tb As DataTable = CreateTabl()
  3.     DataGridView1.DataSource = CropeArr(tb)
  4. End Sub
  5. Private Function CropeArr(ByVal Arr As System.Data.DataTable) As System.Data.DataTable
  6.     'в таблице Arr два поля Фамилия и Дата
  7.     Dim tbb = Arr.AsEnumerable().Distinct(New rComp)
  8.     Dim tb As New DataTable
  9.     tb.Columns.Add("Фамилия", System.Type.GetType("System.String"))
  10.     tb.Columns.Add("Дата", System.Type.GetType("System.DateTime"))
  11.     For Each r As DataRow In tbb
  12.         tb.Rows.Add(r.ItemArray)
  13.     Next
  14.     Return tb
  15. End Function
  16. Private Class rComp : Implements IEqualityComparer(Of DataRow)
  17.     Public Overloads Function Equals(ByVal b1 As DataRow, ByVal b2 As DataRow) _
  18.                As Boolean Implements IEqualityComparer(Of DataRow).Equals
  19.         Dim bb As Boolean
  20.         If String.Compare(b1.Item(0), b2.Item(0)) = 0 Then bb = True
  21.         Return bb
  22.     End Function
  23.     Public Overloads Function GetHashCode(ByVal bx As DataRow) _
  24.           As Integer Implements IEqualityComparer(Of DataRow).GetHashCode
  25.         Dim hCode As Integer = bx(0).GetHashCode
  26.         Return hCode.GetHashCode()
  27.     End Function
  28. End Class

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.375 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы