Je suis en train de construire une calculatrice semi-compliquée qui est essentiellement une conversion à partir d'une feuille de calcul Excel qui m'a été fournie. Je l'ai clouée en grande partie, mais il y a une partie dans la feuille de calcul Excel où plusieurs calculs ont lieu entre 6 lignes et 7 colonnes, mais le problème est que les calculs ne se font pas dans un ordre particulier.Calcul d'un tableau de valeurs en C# (Formule de conversion à partir d'Excel)
Ainsi, par exemple, Row0[Column1]
est calculé à l'aide (Row2[Column4] * Row2[Column5])
et Row1[Column4]
est calculée à l'aide (Row4[Column2]/Row5[Column1])
et ainsi de suite .. vous voyez l'idée.
J'ai pensé à utiliser un tableau 2D, mais j'ai peur que les valeurs se calculent dans un ordre particulier, n'ayant donc aucune valeur quand elles sont atteintes. Pour autant que je sache, Row1 sera calculé d'abord, puis Row2, Row3, etc.
Ainsi, sans créer une variable pour chaque cellule dans ma feuille de calcul Excel (et le commander de façon appropriée) , y a-t-il un moyen de calculer cela en utilisant C#?
J'apprécierais vraiment n'importe quelle aide, conseil, pointeurs, tout ce que vous pensez être possible - j'aimerais l'entendre!
EDIT Après la mise en œuvre de la classe Lazy fournies par @dtb, j'ai le code suivant. C'est une copie directe de ce qui est dans la feuille de calcul Excel que j'ai reçue, y compris les pointeurs & calculs.
var sr = new Lazy<decimal>[6, 6];
sr[0, 0] = new Lazy<decimal>(() => sr[1, 0].Value - eNumber);
sr[0, 3] = new Lazy<decimal>(() => sr[0, 4].Value - sr[1, 0].Value - sr[1, 4].Value);
sr[0, 4] = new Lazy<decimal>(() => sr[0, 0].Value * edD);
sr[0, 5] = new Lazy<decimal>(() => sr[0, 0].Value);
sr[1, 0] = new Lazy<decimal>(() => sr[1, 5].Value);
sr[1, 4] = new Lazy<decimal>(() => sr[1, 0].Value * edD);
sr[1, 5] = new Lazy<decimal>(() => sr[2, 0].Value + sr[2, 5].Value);
sr[2, 0] = new Lazy<decimal>(() => eNumber * rRate);
sr[2, 4] = new Lazy<decimal>(() => sr[2, 0].Value * hdD);
sr[2, 5] = new Lazy<decimal>(() => sr[1, 5].Value);
sr[3, 1] = new Lazy<decimal>(() => sr[2, 5].Value);
sr[4, 2] = new Lazy<decimal>(() => eNumber * (ePc/100) + sr[2, 0].Value * (hlPc/100) - sr[3, 1].Value);
sr[5, 0] = new Lazy<decimal>(() => (sr[0, 0].Value + sr[1, 0].Value + sr[2, 0].Value)/ePerR);
sr[5, 2] = new Lazy<decimal>(() => sr[5, 0].Value/rLifecycle);
sr[5, 4] = new Lazy<decimal>(() => sr[5, 2].Value);
sr[5, 5] = new Lazy<decimal>(() => sr[5, 0].Value + sr[5, 2].Value - sr[5, 4].Value);
Cependant je reçois l'erreur suivante
ValueFactory attempted to access the Value property of this instance.
recherche sur Google l'erreur a retourné un groupe de sites de type spam de recherche.
Marko
De quel type d'erreur s'agit-il? Une erreur de compilation ou une exception? Avez-vous amélioré la classe Lazy pour faire une détection de dépendance circulaire par hasard? Parce qu'il y en a un dans vos définitions: sr [1,5] est défini en termes de sr [2,5] et vice versa. – dtb
Salut @dtb - le projet compile mais je reçois une exception. J'ai eu recours à .NET 4 pour le moment (jusqu'à ce que je l'ai fonctionné dans la classe originale). Au fait, je ne sais pas trop comment étendre la classe pour les dépendances circulaires, c'est (tout à fait) un peu en dehors de mon champ de connaissance. – Marko
Ensuite, vous venez de rencontrer la détection de dépendance circulaire de la classe .NET 4.0 Lazy. Vous pouvez l'implémenter vous-même en affectant valueCreated à 1 * avant d'appeler valueFactory, à 2 after, et en lançant une exception si Value est appelée et valueCreated vaut 1 ... Vérifiez s'il y a vraiment une définition circulaire dans votre feuille Excel. Si c'est le cas, postez une nouvelle question avec les formules Excel et demandez comment calculer le point fixe en C#. Mais je soupçonne que vous avez une faute de frappe dans votre code. – dtb