Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Добавление только уникальных записей в ListView / 2 сообщений из 2, страница 1 из 1
25.04.2015, 02:10
    #38945106
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление только уникальных записей в ListView
ListView, Details(Report)
2 столбца
1-й - порядковый номер, 2-й - номер телефона (str_add)
При добавлении новой строчки добавляю key(.Name) как "key" & str_to_add и проверяю что ключ уникален (чтоб не лазить по column). Соответственно я должен проверить что комбинации "key" & str_to_add еще не существует

В VB6 я поступал так:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
    If Len(str_to_add) > 0 Then
      SC = ListView1.ListItems.count
      On Error Resume Next
      Set lItem = ListView1.ListItems.Add(, "key" & str_to_add, SC + 1)
      If Err.NUMBER = 0 Then
        ListViewSetItemPicture ListView1, lItem.index, 0
        lItem.SubItems(1) = str_to_add
      End If
    End If
    FormProgress.IncreasePValue
  Next i


То бишь при попытке добавить item с уже существующим ключом проскакивал по On Error Resume Next и item не добавлялся.
(это работает в VB6 очень быстро)

В .Net другая объектная модель, нету .key а есть .Name и он НЕ УНИКАЛЕН, т.е. подобным макаром просто будут добавляться одинаковые .Name. Да и тормознутый Try...Catch здесь не потянет (даже если б работало).

Накатал было такой код:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
...
        If Me.ListView1.Items("key" & str_to_add) Is Nothing Then 'проверка отсутствия "ключа"
          LItem = Me.ListView1.Items.Add(New ListViewItem)
          LItem.Name = "key" & str_to_add
          LItem.Text = (SC + 1).ToString
          LItem.ImageKey = "NUMBERS"
          LItem.SubItems.Add(New ListViewItem.ListViewSubItem) 'добавим пустой SubItem -1шт
          LItem.SubItems(1).Text = str_to_add
        Else
          'Debug.Print("exist")
        End If
      End If
    Next


Но тормознутость растет в геометрической прогрессии, т.е. добавление 500 итемов еще боле менее, а если 10000 - будем ждать до утра (скорее всего при добавлении каждого бегает циклом по всем предыдущим чтобы понять Is Nothing или нет). Никуда не годится.

Есть идеи?

М.б. немного виртуализовать?
К примеру перед циклом добавить все имеющиеся ключи в Collection (м.б. в Dictionary?), добавлять их параллельно в эту коллекцию(словарь) и наличие проверять через них (а не дергать ListView)?
Какой инструмент в .Net быстро работает?
Dictionary вроде в .Net быстрый. Как то с картинкой по пикселям мудрил. VB6 тормозил, .Net летал.
...
Рейтинг: 0 / 0
25.04.2015, 02:44
    #38945107
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление только уникальных записей в ListView
Вот так попробовал:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
   Dim coll As New Collection
    For Each item As ListViewItem In ListView1.Items
      coll.Add(Nothing, item.Name)
    Next

    For...
...
      If Strings.Len(str_to_add) > 0 Then
        SC = Me.ListView1.Items.Count
        'проверка что таких данных не существует под другими записями
        If coll.Contains("key" & str_to_add) = False Then
           LItem = Me.ListView1.Items.Add(New ListViewItem)
          LItem.Name = "key" & str_to_add
          LItem.Text = (SC + 1).ToString
          LItem.ImageKey = "NUMBERS"
          LItem.SubItems.Add(New ListViewItem.ListViewSubItem) 'добавим пустой SubItem -1шт
          LItem.SubItems(1).Text = str_to_add
          coll.Add(Nothing, LItem.Name)
        Else
          'Debug.Print("exist")
        End If
      End If
    Next
    coll.Clear()



10000 записей за пару секунд добавляет, повторное добавление того же списка (т.е. ничего не добавляется, только проверка) - мгновенно, т.е. 2 сек уходят на собственно добавление в ListView -это нормально. 50000 записей - секунд 10 на глаз.

Сойдет.

Dictionary видимо не по теме.
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Добавление только уникальных записей в ListView / 2 сообщений из 2, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]