Numaralandırıcılar Nasıl ve Nerede Kullanılır?
Numaralandırıcı, bir kapsayıcı veya koleksiyon arasında geçiş yapma yeteneği sağlayan bir nesnedir. Numaralandırıcılar, koleksiyondaki verileri okumak için kullanılabilir, ancak temeldeki koleksiyonu değiştirmek için kullanılamazlar, oysa IEnumerable, bir IEnumerator arabirimi döndüren GetEnumerator yöntemini tanımlayan bir arabirimdir; bu da, salt okunur erişime izin verir. bir koleksiyon.
Aspose.Cells API’ler bir grup numaralandırıcı sağlar, ancak bu makale temel olarak aşağıda listelenen üç türü tartışır.
- Cells Numaralandırıcı
- Satır Numaralandırıcı
- Sütun Numaralandırıcı
Numaralandırıcılar nasıl kullanılır?
Cells Numaralandırıcı
Cells Numaralandırıcıya erişmenin çeşitli yolları vardır ve uygulama gereksinimlerine göre bu yöntemlerden herhangi biri kullanılabilir. İşte hücre numaralandırıcısını döndüren yöntemler.
Yukarıda belirtilen yöntemlerin tümü, başlatılmış olan hücrelerin koleksiyonunda gezinmeye izin veren numaralandırıcıyı döndürür.
Aşağıdaki kod örneği, bir Cells koleksiyonu için IEnumerator arabiriminin uygulanmasını gösterir.
// 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); | |
} |
Satır Numaralandırıcı
Satırlar Numaralandırıcı kullanılırken erişilebilir.RowCollection.GetEnumerator yöntem. Aşağıdaki kod örneği, IEnumerator arabiriminin uygulanmasını gösterir.Satır Koleksiyonu.
// 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); | |
} |
Sütun Numaralandırıcı
Sütun Numaralandırıcıya, kullanılırken erişilebilir.ColumnCollection.GetEnumerator yöntem. Aşağıdaki kod örneği, IEnumerator arabiriminin uygulanmasını gösterir.Sütun Koleksiyonu.
// 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); | |
} |
Numaralandırıcılar nerede kullanılır?
Numaralandırıcı kullanmanın avantajlarını tartışmak için gerçek zamanlı bir örnek ele alalım.
Senaryo
Bir uygulama gereksinimi, belirli bir hücredeki tüm hücreleri geçmektir.Çalışma kağıdıdeğerlerini okumaktır. Bu hedefi gerçekleştirmenin birkaç yolu olabilir. Birkaçı aşağıda gösterilmiştir.
Görüntüleme Aralığını Kullanma
// 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 ve MaxDataColumn’u Kullanma
// 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); | |
} | |
} | |
} |
Yukarıda bahsedilen yaklaşımların her ikisinin de aşağı yukarı benzer bir mantık kullandığını gözlemleyebileceğiniz gibi; hücre değerlerini okumak için koleksiyondaki tüm hücreler üzerinde döngü yapın. Bu, aşağıda tartışıldığı gibi birkaç nedenden dolayı sorunlu olabilir.
- gibi API’lerMaxRow, MaxDataRow, Maksimum Sütun, MaxDataColumn & Maksimum Görüntü Aralığıilgili istatistikleri toplamak için fazladan zaman gerektirir. Veri matrisinin (satır x sütun) büyük olması durumunda, bu API’lerin kullanılması performans düşüşüne neden olabilir.
- Çoğu durumda, belirli bir aralıktaki tüm hücreler örneklenmez. Bu gibi durumlarda, matristeki her hücreyi kontrol etmek, yalnızca başlatılmış hücreleri kontrol etmeye kıyasla o kadar verimli değildir.
- Bir döngüdeki bir hücreye Cells satır, sütun olarak erişilmesi, bir aralıktaki tüm hücre nesnelerinin somutlaştırılmasına neden olur ve bu da sonunda OutOfMemoryException’a neden olabilir.
Çözüm
Yukarıda belirtilen gerçeklere dayanarak, numaralandırıcıların kullanılması gereken olası senaryolar aşağıdadır.
- Hücre koleksiyonuna salt okunur erişim gereklidir, yani; gereklilik sadece hücreleri incelemektir.
- Çok sayıda hücre geçilecek.
- Geçiş yapılacak yalnızca başlatılmış hücreler/satırlar/sütunlar.