[C#] Key value collection met dubbele keys

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

  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 13-12-2024
Hallo,

Ik wil graag een collectie die bestaat uit een key value pair (string,dictionary) die toestaat om dubbele keys op te slaan.

ik heb nu dit:

C#:
1
2
Dictionary<string, Dictionary<string, string>> commands = 
  new Dictionary<string, Dictionary<string, string>>();


Deze accepteerd echter geen dubbele string values en dat heb ik wel nodig.

is er een datatype waarbij dit wel mogelijk is.

Ik weet niet hoeveel waardes ik ga toevoegen dus ik kan geen array gebruiken, en eigenlijk zou ik het ook dmv generics willen doen om het typesafe te houden.

ik hoop dat jullie mij verder op weg kunnen helpen.

Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...


  • MTWZZ
  • Registratie: Mei 2000
  • Laatst online: 13-08-2021

MTWZZ

One life, live it!

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");
    }
}

[ Voor 14% gewijzigd door MTWZZ op 12-12-2006 11:45 ]

Nu met Land Rover Series 3 en Defender 90


  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 13-12-2024
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");
    }
}
nee dat gaat niet werken, want dan kan ik niet doen:

code:
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...


  • Ruudjah
  • Registratie: November 1999
  • Laatst online: 06-09 20:58

Ruudjah

2022

DIT BERICHT IS PREVENTIEF VERWIJDERD DOOR DE GEBRUIKER

[ Voor 91% gewijzigd door Ruudjah op 01-12-2009 21:59 ]

TweakBlog


  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 13-12-2024
nee dat is geen optie.

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...


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Waarom zou je dat willen? Het idee van een Dictionary is juist dat je aan de hand van een key een value terug krijgt.
Wat verwacht je dan dat je terug krijgt als je
C#:
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

C#:
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.”


  • MTWZZ
  • Registratie: Mei 2000
  • Laatst online: 13-08-2021

MTWZZ

One life, live it!

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.

Nu met Land Rover Series 3 en Defender 90


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
MTWZZ 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.
Idd dan doe je gewoon zoiets
C#:
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.”


  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 09:27

mulder

ik spuug op het trottoir

Gewoon een dataset gebruiken?

oogjes open, snaveltjes dicht


Verwijderd

4of9 schreef op dinsdag 12 december 2006 @ 12:26:
Ik moet echt dubbele keys opslaan.
Ik moet de echte Mona Lisa twee keer hebben.

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 14:25

Janoz

Moderator Devschuur®

!litemod

* Janoz is ook erg benieuwd naar de reden van de dubbele key's.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • whoami
  • Registratie: December 2000
  • Laatst online: 18:04
Ik ook. :)
Waarom gebruik je dan eigenlijk een Dictionary / Hashtable ?

Of, ik zal het anders zeggen: als je dan dit doet:
code:
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/


  • EfBe
  • Registratie: Januari 2000
  • Niet online
C#:
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


  • DroogKloot
  • Registratie: Februari 2001
  • Niet online

DroogKloot

depenisvanjezus

C# heeft geen equivalent van de C++ std::multimap container, zelf klussen dus. ;)

  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 13-12-2024
Verwijderd schreef op dinsdag 12 december 2006 @ 12:50:
[...]
Ik moet de echte Mona Lisa twee keer hebben.
Dank je voor deze contructieve bijdrage...

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:

XML:
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...


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 14:25

Janoz

Moderator Devschuur®

!litemod

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?

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • whoami
  • Registratie: December 2000
  • Laatst online: 18:04
4of9 schreef op dinsdag 12 december 2006 @ 15:35:
[...]


Dank je voor deze contructieve bijdrage...
Mark Platvoet heeft daar toch echt een punt hoor; hij zegt net hetzelfde als hetgeen ik me afvraag, maar dan iets anders verwoord.
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.
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.

https://fgheysels.github.io/


  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 13-12-2024
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.
Ik vind de verwoording niet echt bijdragen aan mijn vraag.
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.
omdat mijn xml structuur dat volgens mij niet toelaat.

ieder commando moet apart in de xml staan met de parameters met verschillende values.
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?
Zo'n commando object is denk ik wel een juiste oplossing.

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 :) (dat was ook mijn vraag)


Als je

Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Ik zou dan inderdaad iets doen als wat Janoz zegt
C#:
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

4of9 schreef op dinsdag 12 december 2006 @ 15:49:
Ik vind de verwoording niet echt bijdragen aan mijn vraag.
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 ;(

Verwijderd

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 _/-\o_ ).

Chapeau!

  • whoami
  • Registratie: December 2000
  • Laatst online: 18:04
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.
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.

https://fgheysels.github.io/


  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 13-12-2024
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 ;(
ik heb altijd geleerd om op zeer abstract niveau te praten over wat ik probeer te bereiken.
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...


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 14:25

Janoz

Moderator Devschuur®

!litemod

Dan ben ik benieuwd waar je de verkeerde weg ingeslagen bent toen je begon met "Ik heb een lijst met commando's".

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 13-12-2024
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.
omdat ik iets kan krijgen in een zeer specifiek geval:

code:
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)
Dan ben ik benieuwd waar je de verkeerde weg ingeslagen bent toen je begon met "Ik heb een lijst met commando's".
eh? ik snap niet helemaal wat je bedoelt.

[ Voor 10% gewijzigd door 4of9 op 12-12-2006 16:28 ]

Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 14:25

Janoz

Moderator Devschuur®

!litemod

Nou, het was meer een reactie op je verhaal over abstract niveau en de zoektoch naar de juiste datastructuur. Ik vroeg me af hoe je zo naar een dictionary/map afgedwaald was terwijl een lijst imho zo obvious lijkt.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 13-12-2024
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.

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...


  • whoami
  • Registratie: December 2000
  • Laatst online: 18:04
Je kan toch gewoon je eigen custom objects aan een lijst gaan toevoegen ?
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/


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 14:25

Janoz

Moderator Devschuur®

!litemod

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.
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.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • EfBe
  • Registratie: Januari 2000
  • Niet online
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 _/-\o_ ).

Chapeau!
offtopic:
Geen dank :)

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 17-10 16:43
Edit: Woops... mja in mijn hoofd leek het verband te houden :P gevalletje: de klok horen luiden, maar niet weten waar de klepel hangt.... *verwijdert zichzelf van dit topic*

[ Voor 87% gewijzigd door roy-t op 14-12-2006 12:04 ]

~ Mijn prog blog!


  • PhysicsRules
  • Registratie: Februari 2002
  • Laatst online: 31-03 07:26

PhysicsRules

Dux: Linux voor Eenden

Je kan met behulp van de juiste attributen aangeven hoe je objecten geserialiseerd moeten worden naar XML. Ben je daar ook meteen klaar mee. Even Googelen voor de juiste syntax. ;)

  • whoami
  • Registratie: December 2000
  • Laatst online: 18:04
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, :P ze geven wel hoe je een array maakt maar niet hoe je ze uitleest :P .. logica!)
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 ?

https://fgheysels.github.io/


Verwijderd

offtopic:
@ EfBe; uiteindelijk had ik het niet eens nodig -> HashMap<String, LinkedList> was al voldoende :+

  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 13-12-2024
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.
Waarschijnlijk omdat ik verder niet hoef te 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...


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
PhysicsRules heeft overigens nog wel een handige tip. Aan de hand van het XmlElementAttribute en nog wat andere Attributes kan je precies bepalen hoe het geserializeerd moet worden.

“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.”


  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 13-12-2024
naar aanleiding van dit topic ben ik mijn code aan het herschrijven met zo'n command object. Dit werkt idd handig en logischer (bedankt daarvoor)

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.

C#:
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...


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 14:25

Janoz

Moderator Devschuur®

!litemod

Staat er toch? "The call is ambiguous". Dat betekend dat de compiler enit weet welke hij moet kiezen. Roep je hem ergens aan met een superclass van Dictionary of ReadOnlyCollection oid?

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 13-12-2024
Nee ik roep hem alleen nog aan met de oude aanroep,

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...


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 30-11 00:17
Dat zou alleen kunnen als
System.Collections.ObjectModel.ReadOnlyCollection<CommandParameter>
Te casten is naar een
System.Collections.Generic.Dictionary<string,string>
Nu zie ik niet zo snel dat dat mogelijk is maar daar zul je misschien zelf meer inzicht in hebben

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.


  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 13-12-2024
Nee die cast gaat niet goed wat mij logisch lijkt omdat de ReadonlyCollectie bestaat uit parameterobjectjes.

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...


  • MTWZZ
  • Registratie: Mei 2000
  • Laatst online: 13-08-2021

MTWZZ

One life, live it!

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?

Nu met Land Rover Series 3 en Defender 90


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 30-11 00:17
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?
Zoiets zou het wel moeten zijn schat ik

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.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14:52

.oisyn

Moderator Devschuur®

Demotivational Speaker

Maar een Dictionary<String, String> vertaalt zich niet op een of andere manier naar een ICollection<CommandParameter>. Ik vind de error ook vaag moet ik zeggen.

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.


  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 13-12-2024
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?
Nee mijn commandParameter object erft niet van KeyValue pair.

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...


  • MTWZZ
  • Registratie: Mei 2000
  • Laatst online: 13-08-2021

MTWZZ

One life, live it!

Nogal van de vreemde. Als ik ff een testje in elkaar schroef gaat het goed:
C#:
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


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14:52

.oisyn

Moderator Devschuur®

Demotivational Speaker

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 :)

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.


  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 13-12-2024
Raar, maar mijn methodes zitten in dezelfde classe, en bij jou zit de overload in een classe die afgeleid is.

Ik mag toch gewoon overloads in dezelfde classe zetten?
.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 :)
ik roep de methodes aan met Add(dictionary<string,string>, string)

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...


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 30-11 00:17
4of9 schreef op donderdag 14 december 2006 @ 13:36:
kan het zijn dat de compiler ook verwacht dat er een null meegegeven kan worden?
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.

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.


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 14:25

Janoz

Moderator Devschuur®

!litemod

Tenzij je daadwerkelijk ergens een aanroep met null hebt. (en dan bedoel ik een uitgeschreven null, niet een nog niet geinitialiseerde variabele) Op dat moment weet de compiler natuurlijk neit welke methode hij moet pakken.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 13-12-2024
Dat is niet het geval....

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...


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14:52

.oisyn

Moderator Devschuur®

Demotivational Speaker

Nope
C#:
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.


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 30-11 00:17
Idd ... nu ben ik toch wel benieuwd met welke code je deze functie _exact_ aanroept.. :)

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.


  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 13-12-2024
zoals ik al een aantal keer gezegd heb:

oude manier
C#:
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)

C#:
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...


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 30-11 00:17
Hmmm raar zeg :?

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.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14:52

.oisyn

Moderator Devschuur®

Demotivational Speaker

.edit: moet comments lezen

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.


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 14:25

Janoz

Moderator Devschuur®

!litemod

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.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14:52

.oisyn

Moderator Devschuur®

Demotivational Speaker

Dat ook ja, maar dat verklaard deze error nog niet ;)

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.


  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 13-12-2024
Ik heb het zelf ook even nagebootst en dat werkt ook prima (ik doe hier exact hetzelfde alleen dan even wat korter geschreven)


C#:
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...


  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 13-12-2024
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.
Ik maak toch een lijst van mijn eigen CommandParam Objecten?


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...


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 14:25

Janoz

Moderator Devschuur®

!litemod

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)

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 13-12-2024
Janoz 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)
Mja dat zag ik net ook :o

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...

Pagina: 1