2009-03-12 6 views
1

J'ai créé une table de hachage de tableaux à deux dimensions en C# et ne peut pas comprendre comment accéder directement aux valeurs du tableau, ce qui suit est mon code actuel:C# Accès Hashtable des tableaux à deux dimensions

// create the hashtable 
Hashtable hashLocOne = new Hashtable(); 

// add to the hashtable if we don't yet have this location 
if (!hashLocOne.ContainsKey(strCurrentLocationId)) 
    hashLocOne.Add(strCurrentLocationId,new double[20, 2] { { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 } }); 

// add to the value at a given array position, this does not work 
hashLocAll[strReportLocationId][iPNLLine, 0] += pnl_value; 

Répondre

5

La table de hachage ne sait pas quels types d'objets y sont stockés; vous devez jeter manuellement chacun:

double result = ((double[,]) table["foo"])[4][5]; 

Vous devez utiliser un dictionnaire au lieu d'un Hashtable si possible:

var dict = new Dictionary<String, double[,]>(); 
double result = dict["foo"][4][5]; 
4
((double[,])hashLocAll[strReportLocationId])[iPNLLine, 0] += pnl_value; 

Pourquoi ne pas utiliser Dictionnaire < chaîne, double [,] >?

-2
  • Je ne vois pas de définitions pour hashLocAll ou strReportLocationId dans votre échantillon code.
  • Vous utilisez un dictionnaire non générique. Utilisez un dictionnaire générique à la place.
  • Vous utilisez une version bastardisée de la notation hongroise. Ne fais pas ça. Débarrassez-vous des préfixes hash, str, i, etc. Ils sont complètement inutiles dans une langue comme C# et ne font que rendre votre code plus difficile à lire.
+0

Sauf pour le point deux (par les autres) complètement inutile. –

+0

Cela n'aide vraiment pas à répondre à la question, et vos deux derniers points me font souhaiter que vous puissiez supprimer les réponses comme "subjectives et argumentatives". – Samuel

0

Donc, vous avez une table de hachage. Vous voulez maintenant obtenir à cette information.

Il semble que hashLoc Tous doit être hashLoc Un. Cependant, je suppose que vous avez une raison à cela.

Avec les tables de hachage, tout à l'intérieur est de type "objet". Ce qui signifie que vous devez faire beaucoup de casting.

Essayez ceci:

((double[,])hashLocOne[strReportLocationId])[iPNLLine, 0] += pnl_value; 

Questions connexes