
C# foreach ile indeks (Geliştiriciler İçin Nasıl Çalışır)
C#'ta, foreach ifadesi, genellikle diziler, listeler veya diğer sayılabilir türler gibi koleksiyonlar üzerinde yinelemek için kullanılır. Ancak, bir sınırlama olarak, foreach döngüsü mevcut yinelemeyi izlemek için yerleşik bir indeks değişkeni sağlamaz. Geliştiriciler genellikle geçerli elemanın indeksine erişmeye ihtiyaç duyar. Aşağıda, bu işlevselliği ve IronPDF kütüphanesini uygulamanın çeşitli yollarını keşfedeceğiz.
Foreach Döngüsünün Temelleri
Foreach döngüsü, diziler, listeler, sözlükler ve IEnumerable'ı uygulayan diğer türler arasında dolaşmayı kolaylaştırmak için tasarlanmıştır. İşte bir tamsayı veri türü dizisini döngülemek için bir foreach ifadesi kullanmanın temel bir örneği:
int[] numbers = { 10, 20, 30, 40 };
foreach (int number in numbers)
{
Console.WriteLine(number);
}Dim numbers() As Integer = { 10, 20, 30, 40 }
For Each number As Integer In numbers
Console.WriteLine(number)
Next numberBu örnekte, number her yineleme sırasında koleksiyonun elemanını temsil eder. Döngü, dizideki tüm elemanlar otomatik olarak üzerinden geçer. Ancak, geçerli elemanın indeksine erişmek için yerleşik bir yol yoktur.
Foreach Döngüsünde İndeks İşleme
Her ne kadar C# doğrudan foreach döngüsünde indeks sağlamasa da, birkaç teknik bunu çözebilir. Bu yöntemleri detaylı olarak tartışalım.
Yöntem 1: Ayrı Bir Değişken Kullanma
Geçerli elemanın indeksini almanın en basit yollarından biri, harici bir indeks değişkeni kullanmaktır. Döngü sırasında manuel olarak artırmanız gerekecektir:
int[] numbers = { 10, 20, 30, 40 };
int numberIndex = 0;
foreach (int number in numbers)
{
Console.WriteLine($"Index: {numberIndex}, Value: {number}");
numberIndex++;
}Dim numbers() As Integer = { 10, 20, 30, 40 }
Dim numberIndex As Integer = 0
For Each number As Integer In numbers
Console.WriteLine($"Index: {numberIndex}, Value: {number}")
numberIndex += 1
Next numberBu kodda, indeks değişkeni döngü başlamadan önce başlatılır ve ardından her iterasyon sırasında döngü içinde artırılır. Bu yaklaşım işe yarasa da, her zaman ideal olmayan şekilde manuel olarak indeksi tutmayı gerektirir.
Yöntem 2: LINQ'nun Select Yöntemini Kullanma
LINQ'un Select yöntemi, bir koleksiyonun her elemanını yeni bir forma, indeksini de içerecek şekilde, projelendirmek için kullanılabilir. İşte bir örnek:
int[] numbers = { 10, 20, 30, 40 };
foreach (var item in numbers.Select((value, index) => new { value, index }))
{
Console.WriteLine($"Index: {item.index}, Value: {item.value}");
}Dim numbers() As Integer = { 10, 20, 30, 40 }
For Each item In numbers.Select(Function(value, index) New With {
Key value,
Key index
})
Console.WriteLine($"Index: {item.index}, Value: {item.value}")
Next itemBu örnekte, Select hem mevcut elemanın değerini hem de indeksini içeren anonim bir nesne oluşturur. Foreach döngüsü bu nesneler üzerinde iterasyon yapabilir ve hem indeks hem de değeri doğrudan erişebilir.
Yöntem 3: Özel Bir İteratör Kullanma
Mevcut elemanı ve indeksini sağlayan bir yöntem oluşturmak için yield return anahtar kelimesini kullanarak özel bir iteratör uzantı metodu uygulayabilirsiniz. Bu, biraz daha gelişmiş ama esnek bir çözüm sunar.
public static IEnumerable<(int index, T value)> WithIndex<t>(this IEnumerable<t> source)
{
int index = 0;
foreach (T value in source)
{
yield return (index, value);
index++;
}
}Imports System.Collections.Generic
Public Module Extensions
<System.Runtime.CompilerServices.Extension>
Public Iterator Function WithIndex(Of T)(source As IEnumerable(Of T)) As IEnumerable(Of (index As Integer, value As T))
Dim index As Integer = 0
For Each value As T In source
Yield (index, value)
index += 1
Next
End Function
End ModuleArtık koleksiyonlarınızla bu uzantı yöntemini kullanabilirsiniz:
int[] numbers = { 10, 20, 30, 40 };
foreach (var (index, value) in numbers.WithIndex())
{
Console.WriteLine($"Index: {index}, Value: {value}");
}Dim numbers() As Integer = { 10, 20, 30, 40 }
foreach var(index, value) In numbers.WithIndex()
Console.WriteLine($"Index: {index}, Value: {value}")
NextBu yaklaşım, manuel indeks yönetimini tekrarlanabilir bir metoda soyutlayarak, indeks sorunu olan foreach için daha zarif bir çözüm yaratır.
İndeksleri Erişmek İçin While Döngüsü Kullanma
Eğer diziler veya listeler gibi koleksiyonlarla çalışıyorsanız, indeks değişkeniyle birlikte bir while döngüsü kullanarak hem indkesi hem de geçerli elemana erişebilirsiniz:
int[] numbers = { 10, 20, 30, 40 };
int index = 0;
while (index < numbers.Length)
{
Console.WriteLine($"Index: {index}, Value: {numbers[index]}");
index++;
}Dim numbers() As Integer = { 10, 20, 30, 40 }
Dim index As Integer = 0
Do While index < numbers.Length
Console.WriteLine($"Index: {index}, Value: {numbers(index)}")
index += 1
Loop
Bu yöntem, indeks değişkenini dizinin veya listenin bir alt yazıtı olarak kullanarak hem indekse hem de geçerli elemana doğrudan erişmenizi sağlar.
.NET'te Özel Koleksiyonlar ve İteratörler
Özel hale getirilmiş koleksiyonlar ile çalışıyorsanız, indeksli erişimi desteklemek için kendi iteratörlerinizi uygulayabilirsiniz. IEnumerable arayüzünü uygulayarak ve yield return ifadesini kullanarak, hem elemanı hem de indeksini döndüren iteratörler oluşturabilirsiniz.
IEnumerable arayüzünü uygulayan özel bir koleksiyon oluşturma örneği:
public class CustomCollection<t> : IEnumerable<t>
{
private T[] _items;
public CustomCollection(T[] items)
{
_items = items;
}
public IEnumerator<t> GetEnumerator()
{
for (int i = 0; i < _items.Length; i++)
{
yield return _items[i];
}
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}Imports System.Collections
Imports System.Collections.Generic
Public Class CustomCollection(Of T)
Implements IEnumerable(Of T)
Private _items As T()
Public Sub New(items As T())
_items = items
End Sub
Public Function GetEnumerator() As IEnumerator(Of T) Implements IEnumerable(Of T).GetEnumerator
For i As Integer = 0 To _items.Length - 1
Yield _items(i)
Next
End Function
Private Function IEnumerable_GetEnumerator() As IEnumerator Implements IEnumerable.GetEnumerator
Return GetEnumerator()
End Function
End ClassBu özel koleksiyonu bir foreach döngüsünde kullanabilirsiniz:
var customCollection = new CustomCollection<int>(new int[] { 10, 20, 30, 40 });
foreach (int number in customCollection)
{
Console.WriteLine(number);
}Dim customCollection As New CustomCollection(Of Integer)(New Integer() { 10, 20, 30, 40 })
For Each number As Integer In customCollection
Console.WriteLine(number)
Next numberGetEnumerator yöntemini uygulayarak ve yield return kullanarak, .NET'teki herhangi bir koleksiyon gibi özel koleksiyonunuzla çalışmasına izin veren bir foreach döngüsü sağlayan bir iteratör oluşturursunuz.
Sözlükleri Kullanarak Anahtar-Değer Çiftlerine İterasyon
Sözlükler ile çalışırken, foreach döngüsü anahtar-değer çiftleri üzerinde doğrudan iterasyon yapmanıza izin verir. Her iterasyonda hem anahtara hem de değere erişmenin yaygın bir kullanım durumu:
Dictionary<int, string> dict = new Dictionary<int, string>
{
{ 1, "Apple" },
{ 2, "Banana" },
{ 3, "Cherry" }
};
foreach (var kvp in dict)
{
Console.WriteLine($"Key: {kvp.Key}, Value: {kvp.Value}");
}Dim dict As New Dictionary(Of Integer, String) From {
{1, "Apple"},
{2, "Banana"},
{3, "Cherry"}
}
For Each kvp In dict
Console.WriteLine($"Key: {kvp.Key}, Value: {kvp.Value}")
Next kvpBu örnekte, kvp.Key size mevcut anahtarı verir ve kvp.Value size mevcut değeri verir.
IronPDF'nin C# foreach Döngüsü ve İndeks ile Kullanımı

IronPDF, C#'ta PDF oluşturma ve diğer PDF ile ilgili görevleri HTML'den PDF oluşturma ile halletmek için bir PDF kütüphanesidir. Ayrıca en son .NET Framework ile de uyumludur. IronPDF kullanarak PDF'ler oluştururken, bir veri koleksiyonuna iterasyon yaparken ve içeriği dinamik olarak PDF dosyanıza eklemeniz gerekebilir. For döngüsünün indeks yönetimiyle birleştirilmesi, güncel öğenin indeksine dayanarak konumlandırma, numaralandırma veya özel mantığı yönetmenize olanak tanır. İşte her bir koleksiyon öğesinin indeksinin yanında belgeye eklenerek IronPDF kullanarak bir PDF oluşturmanın pratik bir örneği.
using IronPdf;
class Program
{
static void Main(string[] args)
{
// Create a new PDF document renderer
var pdf = new ChromePdfRenderer();
// Sample data array
string[] items = { "First Item", "Second Item", "Third Item" };
// Initialize the HTML content with foreach loop and index
string htmlContent = "<html><body>";
int index = 0;
foreach (var item in items)
{
htmlContent += $"<h2>Item {index + 1}: {item}</h2>";
index++;
}
htmlContent += "</body></html>";
// Render the HTML to PDF
var pdfDocument = pdf.RenderHtmlAsPdf(htmlContent);
// Save the PDF document
pdfDocument.SaveAs("output.pdf");
// Notify completion
Console.WriteLine("PDF created successfully with indexed items.");
}
}Imports IronPdf
Class Program
Shared Sub Main(ByVal args As String())
' Create a new PDF document renderer
Dim pdf = New ChromePdfRenderer()
' Sample data array
Dim items As String() = {"First Item", "Second Item", "Third Item"}
' Initialize the HTML content with foreach loop and index
Dim htmlContent As String = "<html><body>"
Dim index As Integer = 0
For Each item In items
htmlContent += $"<h2>Item {index + 1}: {item}</h2>"
index += 1
Next item
htmlContent += "</body></html>"
' Render the HTML to PDF
Dim pdfDocument = pdf.RenderHtmlAsPdf(htmlContent)
' Save the PDF document
pdfDocument.SaveAs("output.pdf")
' Notify completion
Console.WriteLine("PDF created successfully with indexed items.")
End Sub
End Classİşte çıktı PDF dosyası:

Sonuç
C#'ta, foreach döngüsü koleksiyonlar üzerinde yineleme yapmak için uygun bir yol olsa da, yerel indeks desteği eksiktir. Bu sınırlamayı aşmanın birkaç yolu vardır. Basit bir indeks değişkeni, LINQ'tan Select yöntemi veya özel iteratörler kullanmanız fark etmeksizin, yineleme sırasında mevcut veya bir sonraki elemanın indeksine erişebilirsiniz. Bu teknikleri anlamak, özellikle her bir elemanın indeksini bilmeniz gerektiğinde, foreach döngüsünü daha verimli bir şekilde kullanmanıza yardımcı olabilir.
IronPDF ile hemen taahhüt etmenize gerek yok. Yazılımın yeteneklerini derinlemesine keşfetmenizi sağlayan ücretsiz bir deneme sunuyoruz. Gördüklerinizi beğendiyseniz, lisanslar $999'dan başlamaktadır.

Jacob Mellor, Iron Software'de Baş Teknoloji Yöneticisidir ve C# PDF teknolojisinde öncü bir mühendisdir. Iron Software'ın ana kod tabanının ilk geliştiricisi olarak, CEO Cameron Rimington ile birlikte şirketin ürün mimarisini 50'den fazla kişilik bir şirkete dönüştürmüştür ve NASA, Tesla ve dünya genelindeki devlet kurumlarına hizmet etmektedir.
İlgili Makaleler


