Как и где использовать перечислители

Как использовать перечислители

Cells Счетчик

Существуют различные способы доступа к перечислителю Cells, и любой из этих способов можно использовать в зависимости от требований приложения. Вот методы, которые возвращают перечислитель ячеек.

  1. Cells.GetEnumerator
  2. Row.GetEnumerator
  3. Range.GetEnumerator

Все вышеперечисленные методы возвращают перечислитель, который позволяет обойти коллекцию ячеек, которые были инициализированы.

В следующем примере кода демонстрируется реализация интерфейса IEnumerator для коллекции Cells.

// For complete examples and data files, please go to https://github.com/aspose-cells/Aspose.Cells-for-.NET
// The path to the documents directory.
string dataDir = RunExamples.GetDataDir(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
// Load a file in an instance of Workbook
var book = new Workbook(dataDir + "sample.xlsx");
// Get the enumerator from Cells collection
IEnumerator cellEnumerator = book.Worksheets[0].Cells.GetEnumerator();
// Traverse cells in the collection
while (cellEnumerator.MoveNext())
{
var cell = cellEnumerator.Current as Aspose.Cells.Cell;
Console.WriteLine(cell.Name + " " + cell.Value);
}
// Get enumerator from an object of Row
IEnumerator rowEnumerator = book.Worksheets[0].Cells.Rows[0].GetEnumerator();
// Traverse cells in the given row
while (rowEnumerator.MoveNext())
{
var cell = rowEnumerator.Current as Aspose.Cells.Cell;
Console.WriteLine(cell.Name + " " + cell.Value);
}
// Get enumerator from an object of Range
IEnumerator rangeEnumerator = book.Worksheets[0].Cells.CreateRange("A1:B10").GetEnumerator();
// Traverse cells in the range
while (rangeEnumerator.MoveNext())
{
var cell = rangeEnumerator.Current as Aspose.Cells.Cell;
Console.WriteLine(cell.Name + " " + cell.Value);
}

Перечислитель строк

Доступ к перечислителю строк можно получить при использованииRowCollection.GetEnumerator метод. В следующем примере кода демонстрируется реализация интерфейса IEnumerator дляRowCollection.

// For complete examples and data files, please go to https://github.com/aspose-cells/Aspose.Cells-for-.NET
// Load a file in an instance of Workbook
var book = new Workbook(dataDir + "sample.xlsx");
// Get the enumerator for RowCollection
IEnumerator rowsEnumerator = book.Worksheets[0].Cells.Rows.GetEnumerator();
// Traverse rows in the collection
while (rowsEnumerator.MoveNext())
{
var row = rowsEnumerator.Current as Aspose.Cells.Row;
Console.WriteLine(row.Index);
}

Перечислитель столбцов

Доступ к перечислителю столбцов можно получить при использованииColumnCollection.GetEnumerator метод. В следующем примере кода демонстрируется реализация интерфейса IEnumerator дляКолонкаКоллекция.

// For complete examples and data files, please go to https://github.com/aspose-cells/Aspose.Cells-for-.NET
// Load a file in an instance of Workbook
var book = new Workbook(dataDir + "sample.xlsx");
// Get the enumerator for ColumnsCollection
IEnumerator colsEnumerator = book.Worksheets[0].Cells.Columns.GetEnumerator();
// Traverse columns in the collection
while (colsEnumerator.MoveNext())
{
var col = colsEnumerator.Current as Aspose.Cells.Column;
Console.WriteLine(col.Index);
}

Где использовать перечислители

Чтобы обсудить преимущества использования счетчиков, давайте рассмотрим пример в реальном времени.

Сценарий

Требование к приложению состоит в том, чтобы обойти все ячейки в заданномРабочий листчитать их значения. Способов реализации этой цели может быть несколько. Некоторые из них показаны ниже.

Использование диапазона отображения

// For complete examples and data files, please go to https://github.com/aspose-cells/Aspose.Cells-for-.NET
// Load a file in an instance of Workbook
var book = new Workbook(dataDir + "sample.xlsx");
// Get Cells collection of first worksheet
var cells = book.Worksheets[0].Cells;
// Get the MaxDisplayRange
var displayRange = cells.MaxDisplayRange;
// Loop over all cells in the MaxDisplayRange
for (int row = displayRange.FirstRow; row < displayRange.RowCount; row++)
{
for (int col = displayRange.FirstColumn; col < displayRange.ColumnCount; col++)
{
// Read the Cell value
Console.WriteLine(displayRange[row, col].StringValue);
}
}

Использование MaxDataRow и MaxDataColumn

// For complete examples and data files, please go to https://github.com/aspose-cells/Aspose.Cells-for-.NET
// Load a file in an instance of Workbook
var book = new Workbook(dataDir + "sample.xlsx");
// Get Cells collection of first worksheet
var cells2 = book.Worksheets[0].Cells;
int maxDataRow = cells2.MaxDataRow;
int maxDataColumn = cells2.MaxDataColumn;
// Loop over all cells
for (int row = 0; row <= maxDataRow; row++)
{
for (int col = 0; col <= maxDataColumn; col++)
{
// Read the Cell value
var currentCell = cells2.CheckCell(row, col);
if (currentCell != null)
{
Console.WriteLine(currentCell.StringValue);
}
}
}

Как вы можете заметить, оба вышеупомянутых подхода используют более или менее схожую логику, то есть; цикл по всем ячейкам в коллекции, чтобы прочитать значения ячеек. Это может быть проблематично по ряду причин, как описано ниже.

  1. API, такие какМаксРоу, Максдатаров, Максколумн, Максдатаколумн & MaxDisplayRangeтребуется дополнительное время для сбора соответствующей статистики. Если матрица данных (строки x столбцы) велика, использование этих API может привести к снижению производительности.
  2. В большинстве случаев создаются не все ячейки в заданном диапазоне. В таких ситуациях проверять каждую ячейку матрицы не так эффективно, как проверять только инициализированные ячейки.
  3. Доступ к ячейке в цикле как строка Cells, столбец приведет к созданию экземпляров всех объектов ячеек в диапазоне, что в конечном итоге может вызвать исключение OutOfMemoryException.

Заключение

Основываясь на вышеупомянутых фактах, ниже приведены возможные сценарии использования счетчиков.

  1. Требуется доступ только для чтения к коллекции ячеек, т.е. требование состоит только в проверке ячеек.
  2. Необходимо пройти большое количество клеток.
  3. Только инициализированные ячейки/строки/столбцы должны быть пройдены.