/ / Représenter un tableau 3D avec des clés en C # - c #, dictionnaire, génériques, tableau multidimensionnel

Représenter un tableau 3D avec des clés en C # - c #, dictionnaire, génériques, tableau multidimensionnel

Ceci est la suite de cette question: Meilleur moyen de représenter des ensembles de 3 valeurs

Je veux enregistrer la température d'une substanceune fonction du temps et de la position. Donc, la température change avec le lieu et l'heure. en ce qui concerne l'emplacement, j'ai divisé toute la surface du matériau en i * j petites zones afin de pouvoir attribuer une température à chaque zone séparément. Par exemple, on devrait pouvoir lire la température de la zone [3,5] à l'instant = 3 secondes. mon but est d’avoir une collection composée du temps, i et j. Je peux donc accéder à la température à l'instant = 3,5 secondes dans la zone [i = 4, j = 7]. un tableau 3D ne m'aide pas, car je dois pouvoir utiliser le temps comme clé comme ci-dessous:

temperature[3.5][4,7]

ici 3,5 est l'heure, 4 est i et 7 est j. Comment je ferais ça? Et comment dois-je accéder aux données de température?

Réponses:

2 pour la réponse № 1

Si vous voulez implémenter exactement la même interface,alors vous devriez utiliser les propriétés de l'indexeur. Commençons par l'objet qui renvoie la température par position. Je l'appellerai Surface. Vous pouvez utiliser le nom Area ou ce que vous jugez plus approprié. Cet objet devrait contenir les valeurs de température pour chaque position sur votre surface ou aller chercher ces valeurs dans la mémoire:

public class Surface
{
// you can have time property here as well

public double this[int i, int j]
{
get { return GetTemperatureValueFromDataSource(i,j); }
}
}

Maintenant, vous devez renvoyer ces objets pour une durée donnée depuis une autre classe:

public class Temperature
{
public Surface this[double time]
{
get { return GetSurfaceObjectForGivenTime(time); }
}
}

Ensuite, l'interface sera comme vous voulez:

var temperature = new Temperature();
double value = temperature[3.5][4,7];

Notez que vous devriez penser comment gérersituations dans lesquelles vous ne disposez pas de données de température de surface pour une période donnée, ou si vous essayez d’obtenir la température du point de surface en dehors de la plage disponible. null s'il n'y a pas de données pour un temps donné, mais que vous devriez utiliser l'opérateur null-conditionnel pour éviter NullReferenceException:

 double? value = temperature[3.5]?[4,7];

Ou tu peux en rendre NullObject qui aura un comportement factice. Il en va de même pour référencer un point de surface en dehors de la plage disponible. Vous pouvez utiliser le type de retour nullable pour la valeur de température. Ou tu peux jeter ArgumentOutOfRangeException.