[C#] Array's met strings als key, hoe ?

Pagina: 1
Acties:

  • Skinny
  • Registratie: Januari 2000
  • Laatst online: 25-07 18:17
Goedemorgen allemaal,

Ben nu een paar dagen bezig met C# en nu loop ik dus tegen een probleem aan waar ik met google en de search niet uitkom. Ik weet namelijk niet waarop ik moet zoeken, hopelijk kunnen jullie me vertellen hoe ik het onderstaande bereik in C# :

PHP:
code:
1
2
3
4
$var = array();

$var['tekst'] = 'waarde';
$var['tekst2'] = 10;


Inmiddels heb ik alle vormen uit System.Collections al geprobeerd, maar het enige dat ik voor elkaar krijg is dat ik 'strings' kan opslaan in een Hashtable, NameValueCollection of StringDictionary. Het liefst beschik ik dus over een soort array zoals hierboven in PHP, maar dat zal in C# wel niet gaan omdat die stricter met je variabelen omgaat (zeg ik dat goed zo?). In ieder geval wil ik getallen kunnen opslaan in een array-achtige structuur die met strings als keys werkt.

Het is vroeg, dus ik hoop dat dit een beetje duidelijk is. :) Een zetje in de goede richting is zeer welkom.

SIZE does matter.
"You're go at throttle up!"


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Ik neem aan dat dat geen array is, maar een map/dictionary. Bij c# kan je gebruik maken van propertie syntax (je mag dan [..] gebruiken), ik geloof dat je zoiets ook kan doen bij maps.

*is geen c# progger*

[ Voor 13% gewijzigd door Alarmnummer op 20-11-2003 08:55 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 11:10
Je zult toch nog eens goed naar de Hashtable moeten kijken.

In een hashtable kan je alles als value gebruiken, als het maar afgeleid is van object.

https://fgheysels.github.io/


  • Skinny
  • Registratie: Januari 2000
  • Laatst online: 25-07 18:17
whoami schreef op 20 november 2003 @ 08:56:
In een hashtable kan je alles als value gebruiken, als het maar afgeleid is van object.
Okay.. dan het volgende :

code:
1
2
3
Hashtable var = new Hashtable();
var.Add("lala", 1 );
var["lala"] = var["lala"] + 1;


Levert de foutmelding :

Operator '+' cannot be applied to operands of type 'object' and 'int'

Als ik dan doe :
code:
1
2
3
Hashtable var = new Hashtable();
var.Add("lala", 1 );
var["lala"] = Convert.ToInt32(var["lala"]) + 1;


Lijkt het wel te werken, maar waarom wordt de integer value automatisch naar een object omgezet. Die redenering snap ik niet helemaal

SIZE does matter.
"You're go at throttle up!"


  • whoami
  • Registratie: December 2000
  • Laatst online: 11:10
Int32 is afgeleid van object. Int32 is dus eigenlijk een object.

Als je een variabele die afgeleid is van object gaat toewijzen aan die hashtable, dan maakt die hashtable geen bezwaar: die variabele is nl. een object.
Echter, als je die variabele gaat uitlezen, dan returned die ook een 'object'. Dat moet jij dus nog eens zelf gaan casten.

https://fgheysels.github.io/


  • Skinny
  • Registratie: Januari 2000
  • Laatst online: 25-07 18:17
Hij "onthoud" dus zeg maar niet zelf in welke vorm hij (de hash) het heeft gehad en in welke vorm hij het terug moet geven.. Weer even verder proberen...

SIZE does matter.
"You're go at throttle up!"


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Je hoeft trouwens niet perse Convert.ToInt32( ) te gebruiken je kan het ook gewoon zo casten
C#:
1
int i = (int)hashtable[ "myKey" ];

en je hoeft ook niet de add methode te gebruiken dat kan je ook gewoon zo doen
C#:
1
hashtable[ "myKey" ] = "myValue";

Als er nog geen entry bestaat van "myKey" dan wordt deze automatisch aangemaakt. Als hij wel bestaat wordt de value overschreven.
Skinny schreef op 20 november 2003 @ 09:20:
Hij "onthoud" dus zeg maar niet zelf in welke vorm hij (de hash) het heeft gehad en in welke vorm hij het terug moet geven.. Weer even verder proberen...
Als parameter geef je een object mee want het moet bruikbaar zijn voor alle types. Omdat je het dan zo generiek mogelijk wil houden returnt de indexer van een hashtable ook een object.
In versie 2 van C# kan je ook gebruik maken van Generics en kan je wel opgeven wat voor Type het om gaat. Dat gaat dan ongeveer op de volgende manier

C#:
1
2
3
Hashtable<string, int> hashtable = new Hashtable<string, int>();
hashtable[ "myKey" ] = 1;
int i = hashtable[ "myKey" ];


Hier geef je dus al bij het declareren van je Hashtable aan wat voor type de Key moet hebben en wat voor type de Value moet hebben.

[ Voor 54% gewijzigd door Woy op 20-11-2003 09:48 ]

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


  • EfBe
  • Registratie: Januari 2000
  • Niet online
Skinny, koop, lees Programming C#, Jesse Liberty. Daarna pas opnieuw proberen.

Je hebt het hele concept van OO nauwelijks door en wat boxing/unboxing inhoudt e.d. Dit levert je 1573 vragen per uur op die je kunt voorkomen door een goed boek.

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


  • whoami
  • Registratie: December 2000
  • Laatst online: 11:10
rwb schreef op 20 november 2003 @ 09:45:
Je hoeft trouwens niet perse Convert.ToInt32( ) te gebruiken je kan het ook gewoon zo casten
C#:
1
int i = (int)hashtable[ "myKey" ];
Converten is niet hetzelfde als casten.

https://fgheysels.github.io/


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
whoami schreef op 20 november 2003 @ 09:50:
[...]

Converten is niet hetzelfde als casten.
Tuurlijk niet.

Ik zeg het eigenlijk ook alleen omdat hij er een int instopt. Dan krijgt hij via de indexer een object terug en Convert hij die terug naar een int. terwijl dat niet hoeft want het is al een Int. Dus moet je gewoon casten en niet de Convert methode gebruiken.

edit:

owja ik zie dat het er inderdaad weer eens vaag staat zoals normaal :)

[ Voor 10% gewijzigd door Woy op 20-11-2003 09:54 ]

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


  • Skinny
  • Registratie: Januari 2000
  • Laatst online: 25-07 18:17
EfBe schreef op 20 november 2003 @ 09:47:
Skinny, koop, lees Programming C#, Jesse Liberty. Daarna pas opnieuw proberen.

Je hebt het hele concept van OO nauwelijks door en wat boxing/unboxing inhoudt e.d. Dit levert je 1573 vragen per uur op die je kunt voorkomen door een goed boek.
Offtopic reageren doe ik eigenlijk nooit, maar hier wil ik toch even op antwoorden.

Ik vind het knap van je dat je door alleen deze vraag van mijn kennisniveau kan beoordelen. Bedankt voor de tip van het boek (echt), maar aangezien ik uit een andere hoek kom en ik nu dus met C(#) begin was dit even iets waar ik hedenochtend niet helemaal uitkwam. Beetje kort door de bocht om dan zo te reageren IMO.

SIZE does matter.
"You're go at throttle up!"


  • dotcode
  • Registratie: Augustus 2003
  • Laatst online: 14-08 11:19

dotcode

///\00/\\

Je wilt gewoon een indexer maken:

C++:
1
2
3
4
5
6
7
public int this[string str]{
get { .....
return ....;
}
set {
......
}

  • EfBe
  • Registratie: Januari 2000
  • Niet online
Skinny schreef op 20 november 2003 @ 09:58:
Offtopic reageren doe ik eigenlijk nooit, maar hier wil ik toch even op antwoorden.

Ik vind het knap van je dat je door alleen deze vraag van mijn kennisniveau kan beoordelen. Bedankt voor de tip van het boek (echt), maar aangezien ik uit een andere hoek kom en ik nu dus met C(#) begin was dit even iets waar ik hedenochtend niet helemaal uitkwam. Beetje kort door de bocht om dan zo te reageren IMO.
Je vraag komt voort uit het gebrek aan kennis mbt boxing/unboxing, valuetypes vs object types en kennis mbt basic .NET objects.

Dat is niet een verwijt, maar een constatering. Nu kan jouw vraag gemakkelijk beantwoord worden, dat is het punt niet, het punt is: omdat je die kennis mist, kom je niet veel verder want zodra je het antwoord toepast loop je tegen de volgende vraag aan. Vandaar de opmerking. Niet zeikerig bedoeld, gewoon: denk daar eerst aan en ga dan nog eens proberen. Levert veel meer op voor de tijd die je investeert.

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

Pagina: 1