В настоящее время я создаю полусложный калькулятор, который в основном представляет собой преобразование из электронной таблицы Excel, которую я предоставил.Вычисление массива значений в C# (преобразование формулы из Excel)
Я прикрепил большую часть его, но есть часть в электронной таблице Excel, где несколько расчетов происходят между 6 строками и 7 столбцами, но проблема в том, что вычисления происходят не в каком-то конкретном порядке.
Так, например, Row0[Column1]
рассчитывается с использованием (Row2[Column4] * Row2[Column5])
и Row1[Column4]
рассчитывается с использованием (Row4[Column2]/Row5[Column1])
и так далее .. Вы получаете идею.
Я думал об использовании 2D-массива, но боюсь, что значения будут вычисляться в определенном порядке, не имея при этом значения. Насколько мне известно, Row1 будет рассчитываться первым, затем Стр2, Row3 и т.д.
Таким образом, не создавая переменную для каждой ячейки в моей таблицы Excel (и приказывать его соответствующим образом) , есть ли способ, который я могу вычислить с помощью C#?
Я бы очень признателен за любую помощь, советы, указания, что бы вы ни думали, возможно, я хотел бы это услышать!
EDIT После реализации отложенного класса предоставленного @dtb, у меня есть следующий код. Это прямая копия того, что было в электронной таблице Excel, которую я предоставил, включая указатели & расчетов.
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);
Однако я получаю следующую ошибку
ValueFactory attempted to access the Value property of this instance.
погуглить ошибка вернула кучу спам-сайтов поиска типа.
Марко
Какая ошибка? Ошибка компилятора или исключение? Усилили ли вы класс Lazy для обнаружения круговой зависимости? Потому что в ваших определениях есть один: sr [1,5] определяется в терминах sr [2,5] и наоборот. – dtb
Привет @dtb - проект компилируется, но я получаю исключение. Я прибегал к использованию .NET 4 (пока я не получу его в исходном классе). Кстати, я не уверен, как расширить класс для Circular Dependencies, это (совсем) немного вне моей области знаний. – Marko
Тогда вы только что столкнулись с обнаружением круговой зависимости класса .NET 4.0 Lazy. Вы можете реализовать его самостоятельно, установив valueCreated в 1 * перед * вызовом valueFactory, до 2 после и путем исключения исключения, если Value вызывается, а valueCreated - 1 ... Двойная проверка, действительно ли на вашем листе excel действительно круговое определение. Если есть, опубликуйте новый вопрос с формулами excel и спросите, как вычислить фиксированную точку в C#. Но я подозреваю, что у вас есть опечатка в вашем коде. – dtb