Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| using System; using System.Collections.Generic; public class test { public static void Main(string[] args) { Dictionary<string, List<string>> collection = new Dictionary<string, List<string>>(); collection.Add("foo", new List<string>()); collection["foo"].Add("bar"); collection["foo"].Add("baz"); collection["foo"].Add("qux"); } } |
[ Voor 14% gewijzigd door MTWZZ op 12-12-2006 11:45 ]
Nu met Land Rover Series 3 en Defender 90
nee dat gaat niet werken, want dan kan ik niet doen:MTWZZ schreef op dinsdag 12 december 2006 @ 11:44:
Je kunt zoiets doen:
C#:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 using System; using System.Collections.Generic; public class test { public static void Main(string[] args) { Dictionary<string, List<string>> collection = new Dictionary<string, List<string>>(); collection.Add("foo", new List<string>()); collection["foo"].Add("bar"); collection["foo"].Add("baz"); collection["foo"].Add("qux"); } }
1
2
| collection.Add("foo", new List<string>());
collection.Add("foo", new List<string>()); |
en de structuur moet ook zijn:
Collectie[<string>,Dictionary<string,string>]
Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...
Ik moet echt dubbele keys opslaan.
[ Voor 29% gewijzigd door 4of9 op 12-12-2006 12:27 ]
Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...
Wat verwacht je dan dat je terug krijgt als je
1
| myDict["key"]; |
doet? Als er meerdere keren dezelfde key in zit weet de dictionary nooit wat je wilt doen.
Wat je eventueel kunt doen is een list van KeyValuePairs maken
1
2
3
| List<KeyValuePair<string,Dictionary<string,string>> dict; //of Dictionary<string,Dictionary<string,string>> dict; |
Je zou hier dan natuurlijk een class omheen kunnen bouwen die het gebruik wat makkelijker maakt.
edit:
Wat is eigenlijk precies je bedoeling? Je wilt aan de hand van een key meerdere dictionaries terug krijgen?
[ Voor 9% gewijzigd door Woy op 12-12-2006 12:31 ]
“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”
De indexer kun je dan op dezelfde manier overriden om die ook een List<> te laten returnen.
Nu met Land Rover Series 3 en Defender 90
Idd dan doe je gewoon zoietsMTWZZ schreef op dinsdag 12 december 2006 @ 12:37:
Je kunt denk ik beter een simpele wrapper class maken voor dit probleem en Add etc overriden zodat je kun checken of een key al voorkomt en zo ja de nieuwe value toevoegen aan de List<> die bij die key hoort.
De indexer kun je dan op dezelfde manier overriden om die ook een List<> te laten returnen.
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
| public class MyCollection { private Dictionary<string, List<Dictionary<string,string>>> dict = new Dictionary<string, List<Dictionary<string, string>>>(); public void Add(string key, Dictionary<string,string> value) { if( dict.ContainsKey(key)) { dict[key].Add(value); } else { List<Dictionary<string, string>> newList = new List<Dictionary<string, string>>(); newList.Add(value); dict.Add(key, newList); } } public List<Dictionary<string,string>> this[string key] { get { if( !dict.ContainsKey(key)) return null; return dict[key]; } } } |
Het is dan nog wel handig om een aantal interfaces zoals IEnumerable te implementeren zodat je het ook in foreach loopjes en dergelijke kan gebruiken.
Maar ik vraag me toch echt af wat je er mee wilt bereiken. Mischien is er wel een veel betere oplossing voor.
“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”
oogjes open, snaveltjes dicht
Verwijderd
Ik moet de echte Mona Lisa twee keer hebben.4of9 schreef op dinsdag 12 december 2006 @ 12:26:
Ik moet echt dubbele keys opslaan.
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
Waarom gebruik je dan eigenlijk een Dictionary / Hashtable ?
Of, ik zal het anders zeggen: als je dan dit doet:
1
| Dictionary d = theCollection["foo"]; |
En je hebt 2 entries voor 'foo', hoe ga je dan bepalen welke 'foo' je wil ?
https://fgheysels.github.io/
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
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
| /// <summary> /// Specialized hashtable which can store multiple values for a given key. All values are stored in an UniqueValueList as value. When the /// value is requested, the UniqueValueList is returned, not the actual value. /// </summary> public class MultiValueHashtable<TKey, TValue> : Dictionary<TKey, UniqueValueList<TValue>> { /// <summary> /// Initializes a new instance of the MultiValueHashtable class. /// </summary> /// <param name="capacity">Capacity.</param> public MultiValueHashtable(int capacity):base(capacity) { } /// <summary> /// Initializes a new instance of the MultiValueHashtable class. /// </summary> public MultiValueHashtable():base() { } /// <summary> /// Adds an element with the specified key and value to the set. /// </summary> /// <param name="key">The key of the element to add.</param> /// <param name="value">The value of the element to add. If the key is already existing, the value is added to the existing list of values /// for that key, unless the value also already exists.</param> public void Add(TKey key, TValue value) { UniqueValueList<TValue> valuesStored = null; if(base.ContainsKey(key)) { // already there. valuesStored = base[key]; } else { // new valuesStored = new UniqueValueList<TValue>(); base.Add(key, valuesStored); } valuesStored.Add(value); } /// <summary> /// Adds the objects as values for the specified key. /// </summary> /// <param name="key">Key.</param> /// <param name="values">Values.</param> public void Add(TKey key, ICollection<TValue> values) { UniqueValueList<TValue> valuesStored = null; if(base.ContainsKey(key)) { // already there. valuesStored = base[key]; } else { // new valuesStored = new UniqueValueList<TValue>(); base.Add(key, valuesStored); } valuesStored.AddRange(values); } /// <summary> /// Determines whether the multivaluehashtable contains the key, and if so, if the list of values stored under the key contains the value specified. /// </summary> /// <param name="key">Key.</param> /// <param name="value">Value.</param> /// <returns>true if the key exists and the list of values contains the specified value</returns> public virtual bool Contains(TKey key, TValue value) { if(!base.ContainsKey(key)) { return false; } return this[key].Contains(value); } /// <summary> /// Gets / sets a value for the given key. Hides original indexer /// </summary> /// <remarks>returns null if not found</remarks> public new UniqueValueList<TValue> this[TKey key] { get { if(!base.ContainsKey(key)) { return null; } return base[key]; } set { this.Add(key, value); } } } /// <summary> /// ArrayList which contains solely unique values. /// </summary> public class UniqueValueList<T> : Collection<T> { /// <summary> /// Creates a new UniqueValueList instance. /// </summary> public UniqueValueList():base() { } /// <summary> /// Creates a new UniqueValueList instance. /// </summary> /// <param name="c">Collection of objects to add to this collection. It will use the </param> public UniqueValueList(ICollection<T> c) { foreach(T o in c) { this.Add(o); } } /// <summary> /// Adds the range specified /// </summary> /// <param name="c">Collection with new objects to add</param> public void AddRange(ICollection<T> c) { UniqueValueList<T> toAdd = c as UniqueValueList<T>; if(toAdd==null) { toAdd = new UniqueValueList<T>(c); } foreach(T o in toAdd) { this.Add(o); } } /// <summary> /// Inserts an element into the <see cref="T:System.Collections.ObjectModel.Collection`1"></see> at the specified index, if the object doesn't exist in /// the list yet. /// </summary> /// <param name="index">The zero-based index at which item should be inserted.</param> /// <param name="item">The object to insert. The value can be null for reference types.</param> /// <exception cref="T:System.ArgumentOutOfRangeException">index is less than zero.-or-index is greater than <see cref="P:System.Collections.ObjectModel.Collection`1.Count"></see>.</exception> protected override void InsertItem( int index, T item ) { if( !this.Contains( item ) ) { base.InsertItem( index, item ); } } /// <summary> /// Replaces the element at the specified index, if the item doesn't exist in the list yet. /// </summary> /// <param name="index">The zero-based index of the element to replace.</param> /// <param name="item">The new value for the element at the specified index. The value can be null for reference types.</param> /// <exception cref="T:System.ArgumentOutOfRangeException">index is less than zero.-or-index is greater than <see cref="P:System.Collections.ObjectModel.Collection`1.Count"></see>.</exception> protected override void SetItem( int index, T item ) { if( (IndexOf( item ) == index) || !Contains( item ) ) { base.SetItem( index, item ); } } } |
Wellicht moet je het hier en daar nog even aanpassen, maar het idee is dat je meerdere keren Add kunt aanroepen met dezelfde key en meerdere values, en dat die dan als meerdere values onder dezelfde key worden opgeslagen.
Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com
Dank je voor deze contructieve bijdrage...Verwijderd schreef op dinsdag 12 december 2006 @ 12:50:
[...]
Ik moet de echte Mona Lisa twee keer hebben.
Goed ik zal proberen uit te leggen waarom ik op zoek ben naar een datastructuur waarbij ik dit nodig heb.
Ik wil een commando XML file opbouwen samen met parameters met hun values.
voorbeeld:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| <commandos> <commando name="updatevalues"> <parameters> <id type="int">1</id> <value type="string">piep</string> </parameters> <commando> <commando name="updatevalues"> <parameters> <id type="int">2</id> <value type="string">piep2</string> </parameters> <commando> <commando name="getvaluesbyid"> <parameters> <id type="int">14</id> </parameters> <commando> <commandoss> |
Ik weet echter niet hoeveel commando's ik ga krijgen (ik bouw dit dynamisch op).
De commando naam kan zowel hetzelfde als verschillend zijn. (Vandaar de dubbele keys)
Beschouw het maar als een contract dat afgesloten is: als ik wil updaten moet mijn xml er zo uit zien.
Ik bouw mijn commando's dynamisch op, en lees ook de parameters dynamisch uit.
Vandaar dat ik het op wil slaan als "commandonaam", parameters<string,string>
waarbij het aantal parameters ook dynamisch is.
ik hoop dat het iets duidelijker wordt
Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...
Is volgorde ook van belang?
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
Mark Platvoet heeft daar toch echt een punt hoor; hij zegt net hetzelfde als hetgeen ik me afvraag, maar dan iets anders verwoord.
Zoals reeds gezegd: waarom is een Dictionary die per key een collection bevat dan niet goed genoeg ? En dat is blijkbaar net hetgeen wat de code die EfBe gepost heeft, doet.Goed ik zal proberen uit te leggen waarom ik op zoek ben naar een datastructuur waarbij ik dit nodig heb.
Ik wil een commando XML file opbouwen samen met parameters met hun values.
https://fgheysels.github.io/
Ik vind de verwoording niet echt bijdragen aan mijn vraag.whoami schreef op dinsdag 12 december 2006 @ 15:39:
Mark Platvoet heeft daar toch echt een punt hoor; hij zegt net hetzelfde als hetgeen ik me afvraag, maar dan iets anders verwoord.
omdat mijn xml structuur dat volgens mij niet toelaat.whoami schreef op dinsdag 12 december 2006 @ 15:39:
Zoals reeds gezegd: waarom is een Dictionary die per key een collection bevat dan niet goed genoeg ? En dat is blijkbaar net hetgeen wat de code die EfBe gepost heeft, doet.
ieder commando moet apart in de xml staan met de parameters met verschillende values.
Zo'n commando object is denk ik wel een juiste oplossing.In dat geval snap ik niet waarom je over keys praat. Het lijkt me veel handiger om gewoon een commando object te maken met hierin, naast de naam ook een lijst met parameters. Die commando objecten kun je dan keurig in een list stoppen.
Is volgorde ook van belang?
de volgorde is niet van belang.
Ik praat over keys omdat ik dacht dat het dictionary object de gechikte collectie was om zo'n datastructuur op te slaan. Dit blijkt dat dit niet zo is
Als je
Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...
1
2
3
4
5
6
7
8
9
10
11
| class Commando { string name; List<Parameter> parameters; } class Parameter { int id; object value; Type type; } |
en dan gewoon een List van Commando's gebruiken
“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”
Verwijderd
De bedoeling van die opmerking was om jou te laten nadenken over de vraag. En dan op zo'n manier zodat je zelf het surrealistische gehalte van je vraag zou inzien.4of9 schreef op dinsdag 12 december 2006 @ 15:49:
Ik vind de verwoording niet echt bijdragen aan mijn vraag.
Helaas, ik heb gefaalt
Verwijderd
Dankje efBe, ik was juist naar een dergelijke constructie op zoek, ben bezig met een in-memory inverted file search applicatie en daar komt een dergelijke constructie mij zeer goed van pas (maw. je bespaart me een hoop werk
Chapeau!
Hoe maak je dat XML bestand ?4of9 schreef op dinsdag 12 december 2006 @ 15:49:
[...]
omdat mijn xml structuur dat volgens mij niet toelaat.
ieder commando moet apart in de xml staan met de parameters met verschillende values.
Als je zelf een algoritme schrijft die jouw lijst naar jouw gewenste XML structuur omzet, zie ik niet in wat het probleem is.
https://fgheysels.github.io/
ik heb altijd geleerd om op zeer abstract niveau te praten over wat ik probeer te bereiken.Verwijderd schreef op dinsdag 12 december 2006 @ 16:04:
[...]
De bedoeling van die opmerking was om jou te laten nadenken over de vraag. En dan op zo'n manier zodat je zelf het surrealistische gehalte van je vraag zou inzien.
Helaas, ik heb gefaalt
Implementatie doet er verder niet toe en ook de voor en achter liggende stappen niet. Vandaar misschien iets of wat surrealistisch.
Ik was gewoon op zoek naar een datastructuur maar dat was ook niet helemaal duidelijk.
Helaas, ook ik heb gefaald
Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
omdat ik iets kan krijgen in een zeer specifiek geval:whoami schreef op dinsdag 12 december 2006 @ 16:13:
[...]
Hoe maak je dat XML bestand ?
Als je zelf een algoritme schrijft die jouw lijst naar jouw gewenste XML structuur omzet, zie ik niet in wat het probleem is.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| "insert" "id","1" "value","piep" "id","2" "value","piep1" "id","3" "value","piep2" "id","4" "value","piep3" "id","5" "value","piep4" "id","6" "value","piep5" "id","7" "value","piep6" etc. etc. |
lijkt me gewoon niet handig om daar een xml van te fabrieken.
(en dan loop ik overigens ook weer tegen het dubbele key verhaal aan tenzij ik een NameValueCollectie gebruik)
eh? ik snap niet helemaal wat je bedoelt.Dan ben ik benieuwd waar je de verkeerde weg ingeslagen bent toen je begon met "Ik heb een lijst met commando's".
[ Voor 10% gewijzigd door 4of9 op 12-12-2006 16:28 ]
Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
Is er geen lijst waarbij je kan doen:
List<string,Dictionary<string,string>> ?
(daar was ik eigenlijk naar op zoek maar kon het niet vinden.
hoewel dat commando object me nu wel aanstaat.
iig bedankt allemaal voor het meedenken.
[ Voor 12% gewijzigd door 4of9 op 12-12-2006 16:43 ]
Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...
Ik zie toch niet in waarom je een key/value list wil, want voor zover ik kan zien, gebruik je die functionaliteit toch niet ?
https://fgheysels.github.io/
En dat is dus precies wat ik niet snap. Je start met "ik heb een lijst met commando's". Ikzelf denk dan: "Mooi, dan pak ik een lijst en stop ik daar commando's in". En vervolgens denk ik verder: "Zo, een commando heeft een naam en een lijst parameters". Pas op dat moment kom ik bij Stringetjes en integertjes uit. Sowieso heb je een soort tupel. Iets dat uit 2 dingen bestaat. Waarom grijp je dan naar een map/dictionary wat eerder een verzameling objectjes is die je vervolgens makkelijk met een key op kunt zoeken.4of9 schreef op dinsdag 12 december 2006 @ 16:43:
Ah zo.
Is er geen lijst waarbij je kan doen:
List<string,Dictionary<string,string>> ?
(daar was ik eigenlijk naar op zoek maar kon het niet vinden.
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
Verwijderd schreef op dinsdag 12 december 2006 @ 16:10:
offtopic:
Dankje efBe, ik was juist naar een dergelijke constructie op zoek, ben bezig met een in-memory inverted file search applicatie en daar komt een dergelijke constructie mij zeer goed van pas (maw. je bespaart me een hoop werk).
Chapeau!
Geen dank
Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com
[ Voor 87% gewijzigd door roy-t op 14-12-2006 12:04 ]
Dit heeft er echt niets mee te maken. Misschien beter om enkel te replien als je zelf zeker weet dat het er wel mee te maken kan hebben ?therat10430 schreef op dinsdag 12 december 2006 @ 20:00:
[...]
Is dit niet iets voor je, meerdere dingen onder meerdere dingen opslaan? (sorry als het er totaal niet mee te maken heeft, maar ik las dit toevallig en ik moest aan dit topic denken)
source: http://www.c-sharpcorner....uly/WorkingWithArrays.asp
(hoewel ik die site nogal onduidelijk vind,ze geven wel hoe je een array maakt maar niet hoe je ze uitleest
.. logica!)
https://fgheysels.github.io/
Verwijderd
@ EfBe; uiteindelijk had ik het niet eens nodig -> HashMap<String, LinkedList> was al voldoende
Waarschijnlijk omdat ik verder niet hoef te zoeken.Janoz schreef op dinsdag 12 december 2006 @ 17:07:
[...]
En dat is dus precies wat ik niet snap. Je start met "ik heb een lijst met commando's". Ikzelf denk dan: "Mooi, dan pak ik een lijst en stop ik daar commando's in". En vervolgens denk ik verder: "Zo, een commando heeft een naam en een lijst parameters". Pas op dat moment kom ik bij Stringetjes en integertjes uit. Sowieso heb je een soort tupel. Iets dat uit 2 dingen bestaat. Waarom grijp je dan naar een map/dictionary wat eerder een verzameling objectjes is die je vervolgens makkelijk met een key op kunt zoeken.
Maar ik moet gewoon de commando naam opslaan met daaraan de parameters (collectie van key value pairs), maar dat commando object gaat me er wel uit laten komen
Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...
“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”
nu wil ik echter een method vervangen door een nieuwe maar de oude nog even tijdelijk laten staan maar de compiler zegt dat de 2 methods het zelfde zijn.
1
2
3
4
5
| //oude method public void AddCommand(Dictionary<string, string> parameters, string commandName) //nieuwe method public void AddCommand(ReadOnlyCollection<CommandParameter> parameters, string commandName) |
even buitenbeschouwing gelaten of het goed is of niet dat ik eerst een dictionary gebruikte, waarom krijg ik deze error?
error
Error 2 The call is ambiguous between the following methods or properties: 'XmlCommandComposer.AddCommand(System.Collections.ObjectModel.ReadOnlyCollection<CommandParameter>, string)' and 'XmlCommandComposer.AddCommand(System.Collections.Generic.Dictionary<string,string>, string)
Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
dus AddCommand(Dictionary, string)
en op de nieuwe plaats natuurlijk met de (ReadonlyCollection, string)
Dit zijn toch verschillende typen?
Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...
Te casten is naar eenSystem.Collections.ObjectModel.ReadOnlyCollection<CommandParameter>
Nu zie ik niet zo snel dat dat mogelijk is maar daar zul je misschien zelf meer inzicht in hebbenSystem.Collections.Generic.Dictionary<string,string>
Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.
vandaar dat ik de foutmelding ook niet snap, de compiler zou toch moeten weten welke method hij moet nemen, ze hebben toch 2 verschillende signatures?
Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...
Dat CommandParameter object van jou overerft niet van KeyValuePair?
Nu met Land Rover Series 3 en Defender 90
Zoiets zou het wel moeten zijn schat ikMTWZZ schreef op donderdag 14 december 2006 @ 09:52:
ReadOnlyCollection en Dictionary implementeren allebei ICollection<T> dus misschien dat ie daarom de mist in gaat. Wel een beetje ver gezocht maar dit zou het kunnen zijn.
Dat CommandParameter object van jou overerft niet van KeyValuePair?
Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.
Tenzij de compiler niet kan overloaden op basis van een generic type? Want dan is een ICollection<CommandParameter> natuurlijk niet veel andes dan een ICollection<DictionaryEntry<string, string>> oid.
[ Voor 72% gewijzigd door .oisyn op 14-12-2006 10:56 ]
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Nee mijn commandParameter object erft niet van KeyValue pair.MTWZZ schreef op donderdag 14 december 2006 @ 09:52:
ReadOnlyCollection en Dictionary implementeren allebei ICollection<T> dus misschien dat ie daarom de mist in gaat. Wel een beetje ver gezocht maar dit zou het kunnen zijn.
Dat CommandParameter object van jou overerft niet van KeyValuePair?
Blijf het vaag vinden.
Ik heb even als tijdelijke oplossingen de string en collection omgedraaid in de aanroep van de nieuwe method. (beetje vies maar de oude method gaat toch verdwijnen.)
Feit blijft dat de error er dan nog is en (voor mij) niet te verklaren is, en dat kan ik vaak niet echt hebben
Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...
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
| using System; using System.Collections.Generic; using System.Collections.ObjectModel; public class main { public static void Main(string[] args) { overload o = new overload(); o.Add(new Dictionary<string, string>(), "test"); o.Add(new ReadOnlyCollection<string>("foo"), "test"); } } public class test{ public void Add(Dictionary<string, string> parameters, string commandName) { } } public class overload : test { public void Add(ReadOnlyCollection<CommandParameter> parameters, string commandName) { } } public class CommandParameter { } |
Nu met Land Rover Series 3 en Defender 90
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Ik mag toch gewoon overloads in dezelfde classe zetten?
ik roep de methodes aan met Add(dictionary<string,string>, string).oisyn schreef op donderdag 14 december 2006 @ 13:34:
Duh, overload.Add heeft voorrang op test.Add. Je moet beide functies in dezelfde class zetten, en dan ook nog eens aan 4of9 vragen met wat voor type hij z'n method nou eigenlijk aanroept
Of op de nieuwe manier Add(ReadOnlyCollection<CommandParam>,string)
ik doe hier toch niks gek?
edit:
kan het zijn dat de compiler ook verwacht dat er een null meegegeven kan worden?
want dan kan ik het me voorstellen dat ie niet weet welke method hij moet pakken en zo ja hoe is dit dan te voorkomen?
[ Voor 102% gewijzigd door 4of9 op 14-12-2006 13:49 ]
Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...
Dan zou volgens mij elke overload die als parameter een reference type heeft niet geoverload kunnen worden. Volgens mij wordt dat niet meegenomen in de signature.4of9 schreef op donderdag 14 december 2006 @ 13:36:
kan het zijn dat de compiler ook verwacht dat er een null meegegeven kan worden?
Probeer em eens expliciet naar het nieuwe type te casten bij de aanroep, kijken of de compiler er dan wel uitkomt (testje)
[ Voor 14% gewijzigd door farlane op 14-12-2006 13:58 ]
Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
achteraf gezien ook niet logisch omdat je dan idd geen enkele method met een referentie type kan overloaden zoals hier boven al verteld....
Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; namespace CsTest1 { class Program { static void foo(Dictionary<string,string> d) { } static void foo(ReadOnlyCollection<string> r) { } static void Main(string[] args) { ReadOnlyCollection<string> s = new ReadOnlyCollection<string>(new List<string>()); foo(s); } } } |
Compileert prima hier.
[ Voor 26% gewijzigd door .oisyn op 14-12-2006 14:43 ]
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.
oude manier
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| //ergens vul ik mijn parameters Dictionary<string,string> cmdParams = new Dictionary<string,string>(); cmdParams.Add("paramname","value"); Add(cmdParams,"mycommand"); //OF //ergens maak ik mijn parameter dictionary aan Dictionary<string,string> cmdParams = new Dictionary<string,string>(); //maar vul ik hem niet //en wordt uiteindelijk add aangeroepen Add(cmdParams,"mystring"); |
en ook (nieuwe manier)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| //ergens doe ik dit Command command = new Command("myCommandName"); command.AddParameters("param","value") //en uiteindelijk wordt dit ergens aangeroepen // command.Parameters returned een ReadOnlyCollection<CommandParameters> Add(command.Parameters,command.CommanName); //OF //ergens doe ik dit Command command = new Command("myCommandName"); // worden geen parameters toegevoegd maar mijn CommandParamater list wordt // wel geinit in mijn command object //en uiteindelijk wordt dit ergens aangeroepen // command.Parameters returned een ReadOnlyCollection<CommandParameters> Add(command.Parameters,command.CommanName); |
En ik heb een find all references gedaan en daar zit nergens een andere aanroep tussen.
[ Voor 4% gewijzigd door 4of9 op 14-12-2006 15:29 ]
Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...
Returned je command.Parameters property misschien een verkeerd type ( object bv ) ? Treedt de fout op bij beide calls ( oude en nieuwe ) ?
( Ben nu een beetje in het wilde weg aan het schieten )
[ Voor 3% gewijzigd door farlane op 14-12-2006 16:18 ]
Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.
Ergens klopt je code gewoon niet. Want mijn voorbeeld werkt toch duidelijk wel. En de enige reden die ik kan bedenken die zo'n error geeft is als je een object gebruikt dat zowel een Dictionary<string,string> als een ReadOnlyCollection<CommandParameters> is, maar dat kan niet, want het zijn beide classes, en .Net ondersteunt geen multiple inheritance
[ Voor 204% gewijzigd door .oisyn op 14-12-2006 16:37 ]
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
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
| namespace ConsoleApplication1 { class CommandParam { private string iets; private string ietsanders; } class Command { private List<CommandParam> param = new List<CommandParam>(); public ReadOnlyCollection<CommandParam> Param { get { return param.AsReadOnly(); } } } class Program { static void Foo(Dictionary<string, string> piep, string test) { } static void Foo(ReadOnlyCollection<CommandParam> piep, string test) { } static void Main(string[] args) { Dictionary<string, string> test = new Dictionary<string, string>(); //test.Add("piep", "piep"); Foo(test, "bla"); Command command = new Command(); Foo(command.Param, "test2"); } |
en dit werkt gewoon prima.....
Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...
Ik maak toch een lijst van mijn eigen CommandParam Objecten?Janoz schreef op donderdag 14 december 2006 @ 16:31:
Waarom maak je een command en ga je vervolgens de apparte onderdelen van dat command toevoegen? Het is echt niet verboden om je eigen objecten in een lijst te stoppen! Ik snap niet hoe jij het voor elkaar krijgt om het je zo moeilijk te maken.
edit:
ik snap al waar de verwarring zit...
Die Add voegt niets aan de objecten toe.
Die Add is eigenlijk AddXmlCommand in een Ander object dat een XmlDocument Samenstelt.
Ik zie nu echter wel weer een verbetering die mogelijk is...
[ Voor 21% gewijzigd door 4of9 op 14-12-2006 16:52 ]
Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...
Waarom:
Add(command.Parameters,command.CommanName);
Waarom heb je niet gewoon een lijst waarbij je vervolgens het volgende doet:
Add(command)
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
Mja dat zag ik net ookJanoz schreef op donderdag 14 december 2006 @ 16:51:
Nee, dat lijkt me redelijk duidelijk.
Waarom:
Add(command.Parameters,command.CommanName);
Waarom heb je niet gewoon een lijst waarbij je vervolgens het volgende doet:
Add(command)
maar de error blijft...
[ Voor 3% gewijzigd door 4of9 op 14-12-2006 16:53 ]
Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...