Typ Množina (Set) ve Vb.net   zodpovězená otázka

VB.NET

Zdravím, existuje ve vb.net něco jako Pythonská množina?

Tj pole, které si v metodě add ohlídá aby se v něm každý prvek vyskytl jen jednou, což se dá jednoduše využít při generování neopakujících se náhodných čísel.

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

Nebylo by jednodušší na to zavolat Distinct()?

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

Nejjednodušší způsob bez práce co mě napadá je použít System.Collections.Generic.Dictionary(Of TKey, TValue). TValue by sice zůstalo bez využití, ale účel by to splňovalo. Hlídá si to unikátní hodnoty TKey a při pokusu o vložení duplicitní hodnoty vyvolá vyjímku.

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

A není tento způsob tak trochu "přes ruku"?

Sice je to trochu práce, ale nevidím problém - ani časový, ani z hlediska složitosti, napsat si vlastní List<T>, který si toto pohlídá... a příjde mi to mnohem čistčí, než takto zneužívat Dictionary.

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

Používat pro tyto scénáře Dictionary je naprosto zbytečné, lze použít HashSet<T>, případně SortedSet<T>, pokud potřebujete navíc, aby byly prvky seřazené.

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

Použijte kolekci HashSet<T>. Pokud potřebujete, můžete dle návratové hodnoty metody Add (http://msdn.microsoft.com/cs-cz/library/... poznat, zda přidávaný prvek byl již v množině obsažen (tj. již se nepřidal).

nahlásit spamnahlásit spam 2 / 4 odpovědětodpovědět

A když už tam náhodou bude, bude potřeba ten nově přidaný zase odebrat (za předpokladu, že tam má být pouze jednou). Pěkně idiotské.

Souhlasím s tím, že použití Dictionary není příliš čisté, nicméně nejvíce se to blíží tomu, co potřebuje tazatel. Nejčistší je samozřejmě vlastní implementace IList(Of T), ale je s tím (byť malá) práce.

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

"A když už tam náhodou bude, bude potřeba ten nově přidaný zase odebrat (za předpokladu, že tam má být pouze jednou). Pěkně idiotské."

Příště si prosím nastudujte jak HashSet<T> funguje než sem vypustíte takový nesmysl. Jak jsem napsal nahoře, pokud v množině daný prvek už je, tak se již podruhé nepřidá - je to množina a ta jak obecně známo může stejný prvek obsahovat pouze jedenkrát.

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

Ano, v tomto případě jsem se skutečně zmýlil. Je to tím, že HashSet jsem se neobtěžoval zkoušet.

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

Díky za odpovědi, HashSet vypadá dobře, vyzkouším.

Edit: OK, to je přesně jak množina v Pythonu.

        'Prázdná množina
        Dim Mnozina_cisel As HashSet(Of Integer) = New HashSet(Of Integer)()

Do
            Dim Cislo As Integer = r.Next(1, 50) ' 1až 49
            Mnozina_cisel.Add(Cislo)
        Loop While Mnozina_cisel.Count < 6
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