列挙子の使用方法と場所
列挙子は、コンテナやコレクションをトラバースする能力を提供するオブジェクトです。列挙子はコレクション内のデータを読むために使用できますが、基礎となるコレクションを変更することはできません。一方、IEnumerableは、GetEnumeratorメソッドを定義するインターフェースであり、これにより読み取り専用アクセスが可能なICollectionインターフェースが返されます。
Aspose.CellsのAPIはたくさんの列挙子を提供していますが、この記事では主に以下にリストされている3つのタイプについて説明しています。
- セル列挙子
- 行列挙子
- 列列挙子
列挙子の使用方法
セル列挙子
セル列挙子へのアクセス方法にはさまざまな方法があり、アプリケーションの要件に基づいてこれらのメソッドのいずれかを使用できます。セル列挙子を返すメソッドは次のとおりです。
上記のすべての方法は、初期化されたセルコレクションをトラバースする列挙子を返します。
以下のコード例は、CellsコレクションのIEnumeratorインターフェースの実装を示しています。
行列挙子
RowCollection.GetEnumeratorメソッドを使用しながら行列挙子にアクセスできます。次のコード例は、RowCollectionのIEnumeratorインターフェースの実装を示しています。
列列挙子
列の列挙子は、ColumnCollection.GetEnumeratorメソッドを使用している間にアクセスできます。次のコード例では、ColumnCollectionのIEnumeratorインターフェイスの実装を示します。
列挙子の使用場所
列挙子の利点を議論するために、実際の例を使って説明しましょう。
シナリオ
アプリケーションの要件は、与えられたWorksheet内のすべてのセルを走査してその値を読み取ることです。この目標を実装するための方法はいくつかあります。いくつかを以下で示します。
表示範囲を使用する
MaxDataRowおよびMaxDataColumnを使用する
上記のアプローチのそれぞれがほとんど同じロジックを使用していることがわかります。つまり、コレクション内のすべてのセルをループしてセルの値を読み取ります。これにはいくつかの理由で問題が生じる可能性があります。
- MaxRow、MaxDataRow、MaxColumn、およびMaxDataColumn などのAPIは、対応する統計情報を収集するための追加時間を必要とします。データ行列(行×列)が大きい場合、これらのAPIを使用するとパフォーマンスにペナルティが課される場合があります。
- ほとんどの場合、指定された範囲内のすべてのセルがインスタンス化されていません。そのような状況では、行列内のすべてのセルを確認することは、初期化されたセルのみを確認する場合と比べて効率的ではありません。
- Cells row、columnとしてセルにアクセスすることは、範囲内のすべてのセルオブジェクトをインスタンス化することになり、最終的にOutOfMemoryExceptionを引き起こす可能性があります。
結論
上記の事実に基づいて、列挙子を使用すべき可能なシナリオが以下に示されています。
- セルコレクションの読み取り専用アクセスが必要な場合、つまり、セルの確認のみが必要な場合。
- 多数のセルを走査する必要がある場合。
- 初期化されたセル/行/列のみを走査する必要がある場合。