列挙子を使用する方法と場所
列挙子は、コンテナーまたはコレクションを走査する機能を提供するオブジェクトです。列挙子は、コレクション内のデータを読み取るために使用できますが、基になるコレクションを変更するために使用することはできません。一方、IEnumerable は、IEnumerator インターフェイスを返す 1 つのメソッド GetEnumerator を定義するインターフェイスであり、これにより、次への読み取り専用アクセスが許可されます。コレクション。
Aspose.Cells API は多数の列挙子を提供しますが、この記事では主に以下に示す 3 つのタイプについて説明します。
- Cells 列挙子
- 行列挙子
- 列列挙子
列挙子の使用方法
Cells 列挙子
Cells 列挙子にアクセスするにはさまざまな方法があり、アプリケーションの要件に基づいてこれらの方法のいずれかを使用できます。セル列挙子を返すメソッドは次のとおりです。
上記のすべてのメソッドは、初期化されたセルのコレクションをトラバースできる列挙子を返します。
次のコード例は、Cells コレクションの IEnumerator インターフェイスの実装を示しています。
// 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); | |
} |
行列挙子
Rows Enumerator は、RowCollection.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 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); | |
} |
列列挙子
Columns Enumerator は、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最大行, MaxDataRow, 最大列, MaxDataColumn & MaxDisplayRange対応する統計を収集するために余分な時間が必要です。データ マトリックス (行 x 列) が大きい場合、これらの API を使用すると、パフォーマンスが低下する可能性があります。
- ほとんどの場合、特定の範囲内のすべてのセルがインスタンス化されるわけではありません。このような状況では、マトリックス内のすべてのセルをチェックすることは、初期化されたセルのみをチェックする場合に比べて効率的ではありません。
- Cells 行、列としてループ内のセルにアクセスすると、範囲内のすべてのセル オブジェクトがインスタンス化され、最終的に OutOfMemoryException が発生する可能性があります。
結論
上記の事実に基づいて、列挙子を使用する必要があるシナリオを次に示します。
- セル コレクションへの読み取り専用アクセスが必要です。要件は、セルのみを検査することです。
- 多数のセルをトラバースする必要があります。
- 初期化されたセル/行/列のみが走査されます。