Робота з електронною таблицею в Visual C # (Sharp)

Тепер, коли інтерфейси та їх реалізації готові, ми можемо використовувати елерони таблицю Для прикладу візьмемо таблицю для обчислення середнього по нору чисел, після чого обчислимо відхилення кожного числа від середнього значення

Таблиця обчислює середнє значення набору чисел, яке потім віднімається від кожного числа набору Приклад демонструє зчитування всієї таблиці, щоб отримати середнє значення, і зчитування окремих елементів для виконання обчислень Обчислимо середнє значення наступних чисел:

double[] items = new doublet] { 10, 20, 30 }

Середнє значення буде 2 Про, а обчислення відхилення кожного числа від середнього дає послідовність -1, 0 і 1

Щоб виконати ці обчислення в електронній таблиці, першим кроком потрібно оголосити і заповнити примірник iworksheeto Для створення екземпляра iworksheeto ми застосуємо фабрику, яка створить нам примірник класу worksheeto Код для цього виглядає таким чином:

IWorksheet&ltdouble&gt sheetAverage = SpreadsheetManagerCreateEmpytWorksheet&ltdouble&gt(&quot&quot)

doublet] items = new doublet] { 10, 20, 30 } sheetAverageDimension(itemsLength + 10, 3) for (int row = 0 row &lt itemsLength row++) {

sheetAverageSetCellState(row, 0, items[row])

}

Тип листа таблиці оголошується як double (iworksheet ), що дозволить нам працювати з числами подвійної точності Щоб заповнити sheetAverage, числа обробляються в циклі for, після чого присвоюються таблиці за допомогою методу SetCellState () Метод Dimension про необхідний для створення таблиці фіксіранних розмірів

Щоб перевірити, чи успішно пройшло заповнення таблиці, можна викликати метод

Tostring () і подивитися, чи все виглядає належним чином

Наступним кроком буде привласнення значень лямбда-виразів, за допомогою яких буде обчислено середнє значення і відхилення від середнього Присваив операцію обчислення таблиці, потрібно знати, чи буде лямбда-вираз мати стан чи ні Згадайте, що лямбда-вирази мають стану, тому це всього лише питання, чи хочемо ми отримати лямбда-вираз з раеляемим станом або ж лямбда-вираз з індивідуальним станом Для лямбда-виразів для обчислення середнього значення прийнятним буде поділюване стан

Обчислення середнього значення виконується останнім у последовательнті обчислень з масивом Тому при виклику цього обчислення вже є інформація про кількість елементів у вигляді рядка таблиці, в якій воно сраний

sheetAverageAssignCellCalculation(itemsLength,  0, (IWorksheet&ltdouble&gt worksheet, int cellRow, int cellCol) =&gt {

double runningTotal = 00

for (int row = 0 row &lt cellRow row++) { runningTotal += worksheetGetCellState(row, 0)

}

return runningTotal / cellRow

})

У прикладі середнє значення обчислюється за допомогою змінної cellRow, в котой зберігається значення максимального числа рядів таблиці Значення кожної комірки (GetCellStateо), менше, ніж cellRow, додається до поточної сумі (runningTotal), після чого обчислюється і повертається середнє значення, полін діленням runningTotal на cellRow .

Наступним кроком після обчислення середнього значення буде обчислення разни між середнім і окремими числами Результат зберігається в осередку праворуч від осередку, що зберігає стан Відповідний код виглядає так:

for (int row = 0 row &lt itemsLength row++) { sheetAverageAssignCellCalculation(row,  1,

(worksheet, cellRow, cellCol) =&gt (

return worksheetGetCellState(cellRow, 0) – worksheetCalculate(itemsLength,  0)

&gt&nbsp

)

}

Кількість обчислень стану осередку залежить від значення числа елементів в items Кожному обчисленню осередку присвоюється локально оголошене лямбда-вираз, що означає, що лямбда-вирази всіх станів осередків будуть однаковими і розділяти один стан Єдиною розділяється пеменной є змінна itemsLength Всі лямбда-вирази очікують одну і ту ж довжину, тому поділ даної змінної є допустили Відхилення обчислюється відніманням середнього значення від значення вічка в нульовому стовпці

Нарешті, коли всі присвоювання виконані, можна викликати метод worksheetCalculate () для обчислення середнього і відхилення від середнього: sheetAverageCalculate ()

Console WriteLine(sheetAverageToString())

Обчислення в комірках працюють, тому що таблиця володіє можливістю олежівать, які обчислення були виконані, а які ні У звичайній електро таблиці при зміні значення одного з осередків автоматично виконується перерахунок всіх інших клітинок аркуша У даній електронній таблиці такий воожності немає Але в ній є спрощена версія такої можливості, яка забезпечує, що у разі наявності залежностей між осередками, вічка не перчітиваются по кілька разів

Подивіться знову на вихідний код для обчислення відхилення значення осередку від середнього значення Єдино, чому ці обчислення виконуються успішно, так це тому, що осередок, що містить середнє значення, викликається за допомогою методу calculate о Якби був використаний метод Getceiistatef), то середнє значення могло виявитися невичісленним, і результати обчислення відхилення могли б бути спотвореними

Але обчислення середнього значення кожної осередком при будь-якому, яким би незначельним воно не було, зміні є марною тратою ресурсів, т к измения можуть не зачіпати перераховуємо осередок Щоб запобігти цьому, в таблицю вбудований механізм контролю версій, який обчислює осередок тільки до останньої версії Потім, якщо викликається обчислення з таким же номером веіі, то значення не обчислюється, а витягується з стану комірки Далі прищепив код з worksheet <> для управління номерами версій:

public BaseType Calculate(int row, int col) {

if (CurrVersion &gt CalculationVersionfrow, col]) { CellState[row, col] = Cells[row, col](this, row, col) CalculationVersion[row, col] = CurrVersion

}

return CellState[row, col]

}

public void Calculate() { CurrVers ion++

for (int row = 0 row &lt CellsGetLength(0) row++) {

for (int col = 0 col &lt CellsGetLength(1) col++)  {

if (Cells[row, col] = null) { Calculate(row, col)

}

}

}

}

Виклик методу Calculate про без параметрів вказує на необхідність пересчать всю таблицю У реалізації методу Calculate про виконується збільшення пеменной CurrVersion, яка представляє номер версії поточного обчислення

Потім виконується прохід в циклі по всім осередкам і викликається індивідуальна версія методу Calculate про для комірки (метод, що містить параметри row і col), якщо така є У цій версії Calculate про перевіряє, чи не є номер версії обчислення найостаннішим в таблиці, і якщо ні, то викликається лямбдираженіе осередки Після присвоювання нового CellState, номер версії стану осередку збільшується на один і повертається стан комірки

ПРИМІТКА

Обчислення в електронній таблиці не являють собою нічого з ряду геть вихящего, і можна стверджувати, що вони не мають ніякого відношення до предмета даой книги Але насправді такі обчислення і їх сторонні ефект и маю т велику важливість Лямбда-вирази я є видом асинхронної обробки, нодобіе електронної таблиці Обчислення осередків електронної таблиць и не знають, КДА вони будуть викликані, і вони не можуть робити припущень про стан Тому стан при створенні лямбда-вирази може відрізнятися від стану при визе цього виразу Якщо ви чітко не усвідомлюєте цієї можливої ​​проблеми, то может допустити серйозні помилки в розробляється коді

Джерело: Гросс К С # 2008: Пер з англ – СПб: БХВ-Петербург, 2009 – 576 е: ил – (Самовчитель)

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*