[c#] collections

Pagina: 1
Acties:
  • 114 views sinds 30-01-2008
  • Reageer

  • Bint
  • Registratie: Juli 2002
  • Laatst online: 07:55
Dag,

ik werk met visual studio .Net 2003, en heb een HashTable gebruikt om gegevens in op te slaan.
het bestaat uit een unieke key, en een value. Hierover wordt een hash berekend, en volgens de volgorde van deze hash, worden alle items opgeslagen.

Maar dat wil ik niet. Ik wil dat ik aan de hand van key mijn value kan opvragen, en dat de gegevens in volgorde van toevoegen worden opgeslagen. Maar ik zou niet weten welke collection type ik hiervoor moet gebruiken. Bij een arraylist kun je alleen op index zoeken, en bij een sortedlist wordt er op key gesorteerd. Weet iemand wat ik beter kan gebruiken?

Memories of yesterday, will grow, but never die


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 14:52

gorgi_19

Kruimeltjes zijn weer op :9

Gokje: System.Collections.Specialized.NameValueCollection

[ Voor 12% gewijzigd door gorgi_19 op 20-06-2006 14:05 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • -FoX-
  • Registratie: Januari 2002
  • Niet online

-FoX-

Carpe Diem!

Hiervoor moet je even het contract van de verschillende Map implementaties bekijken, die kunnen je vast wel uitsluitsel geven. In Java is deze functionaliteit mogelijk door gebruik te maken van een LinkedHashMap die de insertion-order van de keys als volgorde zal garanderen.

[ Voor 13% gewijzigd door -FoX- op 20-06-2006 14:08 ]


  • Not Pingu
  • Registratie: November 2001
  • Laatst online: 30-01 15:48

Not Pingu

Dumbass ex machina

Bintje schreef op dinsdag 20 juni 2006 @ 13:59:

Maar dat wil ik niet. Ik wil dat ik aan de hand van key mijn value kan opvragen, en dat de gegevens in volgorde van toevoegen worden opgeslagen.
Bij mijn weten kan dat ook en gebeurt dat ook:

code:
1
2
3
Hashtable ht = new Hashtable();
ht.Add("bla", "content");
Response.Write(ht["bla"]);

Certified smart block developer op de agile darkchain stack. PM voor info.


  • whoami
  • Registratie: December 2000
  • Laatst online: 19-02 23:53
Not Pingu: bij een hashtable worden de gegevens altijd in volgorde van de hash opgeslagen, en niet in de volgorde van inserten.

Bintje: je kan een eigen collection type maken dat inherit van NameObjectCollectionBase
Toch niet, want deze gebruikt intern ook een Hashtable zie ik in de help.

[ Voor 16% gewijzigd door whoami op 20-06-2006 14:17 ]

https://fgheysels.github.io/


  • Not Pingu
  • Registratie: November 2001
  • Laatst online: 30-01 15:48

Not Pingu

Dumbass ex machina

whoami schreef op dinsdag 20 juni 2006 @ 14:15:
Not Pingu: bij een hashtable worden de gegevens altijd in volgorde van de hash opgeslagen, en niet in de volgorde van inserten.
Hm, ok. Dat wist ik niet zeker. Een alternatief is een SortedList met een custom IComparer, maar of je daar vrolijk van wordt...

Certified smart block developer op de agile darkchain stack. PM voor info.


  • Macros
  • Registratie: Februari 2000
  • Laatst online: 17-01 08:36

Macros

I'm watching...

Het is toch algemeen bekend dat Hashtables (en HashMaps) de hash van de key gebruiken om hun value op te slaan? Keys zijn uniek, de values niet, dus een hash over de values zou onzinnig zijn. Waarschijnlijk heeft .net ook wel en LinkedHashtable implementatie, als dat er niet is kan je 2 hashtables in een eigen class wrappen, waarbij de ene de key, value paren opslaat en de andere de key,insertion_number (of andersom) opslaat.

"Beauty is the ultimate defence against complexity." David Gelernter


  • Juicy
  • Registratie: December 2000
  • Laatst online: 10:07

-


  • whoami
  • Registratie: December 2000
  • Laatst online: 19-02 23:53
Een SortedList is ook niet de oplossing voor de TS, want, hij wil dat het item dat hij het eerste insert, ook op de eerste positie in de List blijft staan, het tweede op de tweede positie, etc....

Bij een SortedList wordt de volgorde ook bepaald door de waarde van de key.

https://fgheysels.github.io/


  • Not Pingu
  • Registratie: November 2001
  • Laatst online: 30-01 15:48

Not Pingu

Dumbass ex machina

whoami schreef op dinsdag 20 juni 2006 @ 14:22:
Bij een SortedList wordt de volgorde ook bepaald door de waarde van de key.
Maar daar kun je een eigen IComparer schrijven die een andere manier van sorting implementeert. Ik bedenk me net wel dat je dan ook op de een of andere manier moet weten welke key als eerste werd geinsert (index?).

Ander alternatief is een array en een hashtable. In de array sla je de keys nog eens op. Als je daar doorheen loopt, krijg je de keys in volgorde van toevoegen, en kun je daarmee de value opvragen uit de hashtable. Omslachtig, maar het werkt.

Certified smart block developer op de agile darkchain stack. PM voor info.


  • RedBeard
  • Registratie: April 2006
  • Niet online
Waarom maak je niet gewoon gebruik van de linked list

want als ik het goed begrijp wil je key value pairs opslaan en opvolgorde weer uitlezen

[url=http://http://www.c-sharpcorner.com/Code/2003/June/UsingLinkedListInCS.asp]zoiets dus[/url]

I'm not anti-social, I'm just not user friendly


  • Bint
  • Registratie: Juli 2002
  • Laatst online: 07:55
NameValueCollection: geen optie, want ik wil objecten opslaan, geen strings ;)
SortedList: geen optie, want ik wil ze op volgorde van toevoegen kunnen binnenhalen

Ik zal nog eens naar die LinkedList kijken, misshcien dat dat een optie is..
bedankt alvast, en laat de goede ideeen maar binnen stromen ;)

Memories of yesterday, will grow, but never die


  • Bint
  • Registratie: Juli 2002
  • Laatst online: 07:55
hmm..

ik heb de ListDictionary gevonden, maar die geeft meteen aan dat die geschikt is voor 10 items of minder. Heeft iemand hier ervaring mee?
Summary:
Implements IDictionary using a singly linked list. Recommended for collections that typically contain 10 items or less.

[ Voor 35% gewijzigd door Bint op 20-06-2006 15:03 ]

Memories of yesterday, will grow, but never die


  • RedBeard
  • Registratie: April 2006
  • Niet online
Bintje schreef op dinsdag 20 juni 2006 @ 15:03:
hmm..

ik heb de ListDictionary gevonden, maar die geeft meteen aan dat die geschikt is voor 10 items of minder. Heeft iemand hier ervaring mee?


[...]
van de msdn site leesik:
Items in a ListDictionary are not in any guaranteed order; code should not depend on the current order. The ListDictionary is implemented for fast keyed retrieval; the actual internal order of items is implementation-dependent and could change in future versions of the product.
Deze optie wordt dus heel snel traag omdat het zoeken naar een key gewoon topdown gebeurd.

De combinatie van wat jij beschrijft dus en via de key de value terug halen en opvolgorde is gewoon lastig.

Je zou kunnen denken aan twee Collections, een voor het snel vinden per key en 1 voor het uitlezen op volgorde.

Dit zou je eventueel kunnen doen door een eigen collectie aan te maken.

Maar ik snap nog steeds niet helemaal wat je wilt bereiken/wat de toepassing is.

I'm not anti-social, I'm just not user friendly


  • Bint
  • Registratie: Juli 2002
  • Laatst online: 07:55
Ik heb het al gevonden, denk ik:

de NameObjectCollectionBase.
DIe moet ik nog wel in een nieuwe class implementeren, maar dat komt wel goed.
bedankt voor de hulp!

Memories of yesterday, will grow, but never die


  • whoami
  • Registratie: December 2000
  • Laatst online: 19-02 23:53
Zoals ik al eerder gezegd heb, gebruikt NameObjectCollectionBase ook een hashtable achter de schermen....

https://fgheysels.github.io/


Verwijderd

Heel misschien heb je hier iets aan? (heb het snel gemaakt, maar het gaat om het idee, moest toevallig pasgeleden zelf een hashmap implementatie maken)

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
class HashTablePlus
    {
        ArrayList Pairs = new ArrayList();

        public object this[object Key]
        {
            get
            {
                int Index = GetIndexByKey(Key);
                if (Index != -1)
                    return ((Pair)Pairs[Index]).Value;
                else
                    throw new KeyNotFoundException();
            }
        }

        public IEnumerator GetEnumerator()
        {
            return Pairs.GetEnumerator();
        }

        public int Count
        {
            get
            {
                return Pairs.Count;
            }
        }

        public bool ContainsKey(object Key)
        {
            return GetIndexByKey(Key) != -1;
        }

        public bool ContainsValue(object Value)
        {
            return GetIndexByValue(Value) != -1;
        }

        public ArrayList Keys
        {
            get
            {
                ArrayList TmpReturn = new ArrayList();
                foreach (Pair ThisPair in Pairs)
                {
                    TmpReturn.Add(ThisPair.Key);
                }
                return TmpReturn;
            }
        }

        public ArrayList Values
        {
            get
            {
                ArrayList TmpReturn = new ArrayList();
                foreach (Pair ThisPair in Pairs)
                {
                    TmpReturn.Add(ThisPair.Value);
                }
                return TmpReturn;
            }
        }

        public void Remove(object Key)
        {
            int Index = GetIndexByKey(Key);
            if (Index != -1)
                Pairs.RemoveAt(Index);
            else
                throw new KeyNotFoundException();

        }

        public void Add(object Key, object Value)
        {
            if (GetIndexByKey(Key) == -1)
                Pairs.Add(new Pair(Key, Value));
            else
                throw new DuplicateKeyException();
        }

        private int GetIndexByKey(object Key)
        {
            for (int i = 0; i < Pairs.Count; i++)
            {
                if (((Pair)Pairs[i]).Key == Key)
                {
                    return i;
                }
            }
            return -1;
        }

        private int GetIndexByValue(object Value)
        {
            for (int i = 0; i < Pairs.Count; i++)
            {
                if (((Pair)Pairs[i]).Value == Value)
                {
                    return i;
                }
            }
            return -1;
        }

        class Pair
        {
            object _Key;
            object _Value;

            public Pair(object NewKey, object NewValue)
            {
                Key = NewKey;
                Value = NewValue;
            }

            public object Key
            {
                get
                {
                    return _Key;
                }
                set
                {
                    _Key = value;
                }
            }

            public object Value
            {
                get
                {
                    return _Value;
                }
                set
                {
                    _Value = value;
                }
            }
                
        }

        public class DuplicateKeyException : Exception
        {


        }

    }

  • LoekD
  • Registratie: Augustus 2000
  • Laatst online: 24-01 09:34
Wat is C# 2 dan gaaf he.. :)

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
    public class ListDictionary<T, U> : Dictionary<T, U>
    {
        private List<U> _innerList;

        public ListDictionary()
        { 
            _innerList = new List<U>();
        }

        public U this[int index]
        {
            get
            {
                return _innerList[index];
            }           
        }

        public new void Add(T key, U value)
        {
            base.Add(key, value);
            _innerList.Add(value);
        }

        public new void Clear()
        {
            base.Clear();
            _innerList.Clear();
        }
    }


Maar met wat Zoeken en Vervangen van type parameters met 'object' en/of 'string' en dictionary met hashtable, en wat casts moet het wel lukken in 1.1 ook.

Hoe meer je drinkt, hoe korter je leeft, hoe minder je drinkt


  • Bint
  • Registratie: Juli 2002
  • Laatst online: 07:55
whoami schreef op dinsdag 20 juni 2006 @ 15:57:
Zoals ik al eerder gezegd heb, gebruikt NameObjectCollectionBase ook een hashtable achter de schermen....
Ja, maar toch wordt alles in volgorde van toevoegen opgeslagen, volgens MSDN.
na een klein probeersel bleek dus ook dat het in volgorde van toevoegen opslaat, dus dat is gunstig voor mij.

Memories of yesterday, will grow, but never die


  • whoami
  • Registratie: December 2000
  • Laatst online: 19-02 23:53
Vreemd, dat vind ik niet direct terug in de MSDN.

https://fgheysels.github.io/


  • Bint
  • Registratie: Juli 2002
  • Laatst online: 07:55
hmm vreemd,

nu krijg ik het ook niet meer gevonden. Misschien dat ik het toch ergens anders heb gelezen dan.

Maar feit is, al mijn 750 items die ik heb opgeslagen, zijn op de goede volgorde opgeslagen.
Dit kan natuurlijk toeval zijn, maar ik vind het wel frappant.

Memories of yesterday, will grow, but never die


  • Coca-Cola
  • Registratie: Maart 2001
  • Laatst online: 14:38
Bintje schreef op woensdag 21 juni 2006 @ 10:34:
hmm vreemd,

nu krijg ik het ook niet meer gevonden. Misschien dat ik het toch ergens anders heb gelezen dan.

Maar feit is, al mijn 750 items die ik heb opgeslagen, zijn op de goede volgorde opgeslagen.
Dit kan natuurlijk toeval zijn, maar ik vind het wel frappant.
De vraag is natuurlijk of het ook zo blijft na deleten, moven, garbage collection, compiler optimalisaties (?) etc... ;)
Pagina: 1