Il semble étrange que la langue ne contienne apparemment aucune fonctionnalité appropriée. P>
Je me trouve avec des données qui seraient mieux exprimées comme une matrice multidimensionnelle, mais elle est totalement constante, il n'ya aucun moyen que personne ne puisse vouloir le changer sans modifier également le code associé. Face à de telles choses à Delphes, la réponse est évidente - une constante dont la valeur est la table. Cependant, c # ne semble pas supporter quelque chose comme ça. P>
Google affiche de nombreuses personnes qui serrent à ce sujet, pas de bonnes réponses. p>
Comment les gens gèrent ce genre de situation? P>
(Et ne disons pas que les constantes n'appartiennent pas au code - la dernière fois que j'ai heurtée était toutes des permutations possibles de 4 articles. Sauf si la nature même de l'espacétime change ceci est placé en pierre.) P >
Qu'est-ce qui s'est passé ?? Il y avait une réponse qui est venue assez près, je posais un détail et il a disparu! Il suffit de déclarer une sorte de tableau du travail - le seul problème est que l'allocation de la matrice va fonctionner à chaque fois. Celui qui est devant moi contient 96 valeurs - comment puis-je l'obtenir pour initialiser une seule fois? Dois-je juste accepter de l'accepter beaucoup plus large que cela devrait être? (Comme il se trouve, il est dans une routine à 3 lignes qui se trouve à l'intérieur de la routine O (n ^ 3).) P>
6 Réponses :
énumérations, sûrement. p>
Il veut rechercher des valeurs dans une table multidimensionnelle. Il n'y a aucun moyen que vous puissiez utiliser des énumérations pour cela.
aha oui, soudainement la question a plus de sens
Mais je ne vois toujours pas ce que l'inquiétude est à propos. Il n'y a pas besoin de faire la table incapable i> d'accepter des mises à jour. Tout ce qu'il a à faire est de s'abstenir de rédiger un code qui le met à jour.
Peter, par cette mesure, des mots-clés tels que "const" et "Readonly" doivent être jetés, non? :)
Je ne les jeterais pas. Ils sont inoffensifs, le compilateur est stable et que, pour qu'un certain code représente un changement de rupture. Mais vous avez raison de ne pas les avoir ajoutés en premier lieu. J'ai toujours trouvé une langue plus intéressante pour ce que peut être exprimé i> que ce qui ne peut pas.
Eh bien, j'ai pris l'approche de ce qui suit, c'est un peu désagréable de lire mais facile à éditer.
Ce n'est pas entièrement constant. Le «Readonly» vous empêche d'échanger GlobalCollection avec un autre [], mais cela ne vous empêche pas d'échanger GlobalCollection [0] ou [1].
Comment obtenez-vous le compilateur pour prendre cela?
Loren: J'ai édité ma réponse à être multidimensionnelle + plus explicite. Cela fonctionne exactement comme tapé, mais vous devez le spécifier au niveau de la classe / de la structure, pas dans une méthode.
Vous pouvez utiliser une hache réadonnée. Le seul inconvénient est que Readonly ne vous empêche pas de changer la valeur d'un élément particulier de la haquetable. Donc ce n'est pas vraiment const. ou un tableau p> Oui, vous devrez déclarer la variable dans la portée appropriée afin Il n'est pas initialisé plus d'une fois. P> p>
Comme ils em> disent, ajoutez simplement une autre couche d'indirection. C # n'a pas besoin de fournir une structure de données spécialisée en tant que primitive linguistique, bien qu'on souhaite, parfois, il existait une façon de rendre une classe immuable, mais c'est une autre discussion. Vous n'avez pas mentionné si vous n'avez pas mentionné besoin de stocker différentes choses là-bas. En fait, vous n'avez pas mentionné autre chose que multidimensionnelle et aucune possibilité de modifier les valeurs ou les tableaux. Je ne sais même pas si le modèle d'accès (un seul INT, INT, INT, INT) est approprié. P> mais en général, pour une matrice déchiquetée à 3 dimensions, les œuvres suivantes (mais cela n'est pas ' t jolie). p> Une mise en garde est le type que vous construisez-le, il doit également être immuable, mais c'est votre problème. Vous pouvez simplement créer votre propre wrapper en lecture seule. P> public static int[][][] IntInitializer()
{
return xyz // something that constructs a [][][]
}
Je pense que c'est la bonne idée, bien que la mise en œuvre puisse être améliorée. D'une part, si vous copiez les tableaux qui sont transmis, les matrices d'origine peuvent être modifiées. Là encore, si les matrices sont transmises à la construction, il n'ya aucun moyen de les référencer de l'extérieur, donc aucune raison de copier.
vous pouvez toujours changer ce constructeur pour faire un nouveau T [] [] [] et copier toutes les valeurs, mais comme l'utilisation cas semblait être il est fixé une fois, il ne semble pas nécessaire.
Voici une approche similaire , mais utilise un dictionnaire comme le type de données sous-jacent