Как и где использовать перечислители
Перечислитель — это объект, предоставляющий возможность обхода контейнера или коллекции. Перечислители можно использовать для чтения данных в коллекции, но их нельзя использовать для изменения базовой коллекции, в то время как IEnumerable — это интерфейс, определяющий один метод GetEnumerator, который возвращает интерфейс IEnumerator, что, в свою очередь, разрешает доступ только для чтения к Коллекция.
Aspose.Cells API предоставляют множество счетчиков, однако в этой статье в основном обсуждаются три типа, перечисленные ниже.
- Cells Счетчик
- Перечислитель строк
- Перечислитель столбцов
Как использовать перечислители
Cells Счетчик
Существуют различные способы доступа к перечислителю Cells, и любой из этих способов можно использовать в зависимости от требований приложения. Вот методы, которые возвращают перечислитель ячеек.
Все вышеперечисленные методы возвращают перечислитель, который позволяет обойти коллекцию ячеек, которые были инициализированы.
В следующем примере кода демонстрируется реализация интерфейса 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); | |
} | |
} | |
} |
Как вы можете заметить, оба вышеупомянутых подхода используют более или менее схожую логику, то есть; цикл по всем ячейкам в коллекции, чтобы прочитать значения ячеек. Это может быть проблематично по ряду причин, как описано ниже.
- API, такие какМаксРоу, Максдатаров, Максколумн, Максдатаколумн & MaxDisplayRangeтребуется дополнительное время для сбора соответствующей статистики. Если матрица данных (строки x столбцы) велика, использование этих API может привести к снижению производительности.
- В большинстве случаев создаются не все ячейки в заданном диапазоне. В таких ситуациях проверять каждую ячейку матрицы не так эффективно, как проверять только инициализированные ячейки.
- Доступ к ячейке в цикле как строка Cells, столбец приведет к созданию экземпляров всех объектов ячеек в диапазоне, что в конечном итоге может вызвать исключение OutOfMemoryException.
Заключение
Основываясь на вышеупомянутых фактах, ниже приведены возможные сценарии использования счетчиков.
- Требуется доступ только для чтения к коллекции ячеек, т.е. требование состоит только в проверке ячеек.
- Необходимо пройти большое количество клеток.
- Только инициализированные ячейки/строки/столбцы должны быть пройдены.