listview, items.add vs. items.addRange   připomínka

VB.NET, Algoritmy, .NET

Dobrý den,

používám VB 2010 (teď nově) a všiml jsem si jedné věci ohledně listView.

Možná, že jsem objevil Ameriku, tedy toto berte pouze jako zkušenost a tip kdyby jste to náhodou nevěděli:):

Ve svém programu používám ListView a při počátečním naplnění všemy daty to programu docela dlouho trvalo, než byla všechna data načtena. Přitom používám beginUpdate and endUpdate před plněním a po plnění.

Zjistil jsem, že problém byl v přidávání položek po jedné.

v cyklu jsem měl něco jako:

        For i As Integer = 0 To listIssue.count - 1
            dim oneLine as ListViewItem
            'object issue je jedna polozka v listIssue
            Dim issue As New Entry
            issue = listIssue.entryGet(i)
            'buildListViewEntry vraci listViewItem jednoho issue
            oneLine = issue.buildListViewEntry()
            Seznam.Items.Add(oneLine)
        Next

a to jsem změnil na:

Dim addLines(listIssue.count - 1) As ListViewItem
        For i As Integer = 0 To listIssue.count - 1
            Dim issue As New Entry
            issue = listIssue.entryGet(i)
            addLines(i) = issue.buildListViewEntry()
        Next
        Seznam.Items.AddRange(addLines)

Seznam se po této úpravě objevil téměř okamžitě.

PetrS

nahlásit spamnahlásit spam 0 odpovědětodpovědět

No to jste skutečně objevil ameriku, protože metoda AddRange je tam už od nepaměti a slouží právě pro přidávání více položek, což bude mnohem rychlejší než přidávání jedné položky v cyklu. BeginUpdate a EndUpdate slouží pro dočasné vyřazení překreslování položek. Mimochodem kdybyste použil DataBinding, bylo by to ještě rychlejší a nemusel byste se starat o synchronizaci položek mezi datovým zdrojem a ovládacím prvkem.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

AddRange jsem objevil asi tak ve stejnou dobu jako add.

Překvapil mě ale ten rozdíl v rychlosti. Tak jsem se chtěl podělit.

Zrovna tak je veliký rozdíl v rychlosti s/bez použití beginUpdate a endUpdate. Chápu samozřejmě že obé dělá něco jiného, jeden z důsledků je ale pro obé stejný.

Na DataBinding se podívám, díky za tip.

PetrS

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Obecně velmi často platí, že pokud někde je funkce, která dělá nějakou operaci hromadně, je tam proto, aby to bylo rychlejší než dělat to po jedné.

Ono to platí i v běžném životě, když se něco dělá ve velkém, velmi často je to efektivnější.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Naprosto souhlasím, tady ale stejně musím po jednom naplnit to pole, které pak používám pro addRange. Netušil jsem že naplnění pole je něco jiného než naplnění listView. No zřejmě ano.

V životě se tím moc neřídím, a tak když mě chytli, tak jsem si to pěkně odskákal. :)

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback