Altbilgi içeriğine atla
.NET YARDıM

C# Foreach ile İndeks (Geliştiriciler İçin Nasıl Çalışır)

C#'da, foreach ifadesi tipik olarak diziler, listeler veya diğer enumerable türleri gibi koleksiyonlar üzerinde yineleme yapmak 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ştiricilerin genellikle mevcut öğenin indeksine erişmeleri gerekir. Aşağıda, bu işlevselliği uygulamanın çeşitli yollarını ve IronPDF kütüphanesini 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ürlerde yineleme yapmayı basitleştirmek için tasarlanmıştır. İşte bir tamsayı veri türü dizisi üzerinde döngü yapmak için bir foreach ifadesini nasıl kullanabileceğinizi gösteren basit bir örnek:

int[] numbers = { 10, 20, 30, 40 };
foreach (int number in numbers)
{
    Console.WriteLine(number);
}
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 number
$vbLabelText   $csharpLabel

Bu örnekte, number her döngü sırasında koleksiyonun bir elemanını temsil eder. Döngü, dizideki tüm öğeleri otomatik olarak yinelemektedir. Ancak, mevcut öğenin indeksine erişmenin yerleşik bir yolu yoktur.

Bir foreach Döngüsünde İndeksi Ele Alma

C# doğrudan bir foreach döngüsünde indeks sağlamasa da, birkaç teknik bunu çözebilir. Bu yöntemleri ayrıntılı olarak tartışalım.

Yöntem 1: Ayrı Bir Değişken Kullanma

Mevcut öğenin indeksini almanın en basit yollarından biri, harici bir indeks değişkeni kullanmaktır. Bunu döngü içinde manuel olarak artırmanız gerekecek:

int[] numbers = { 10, 20, 30, 40 };
int numberIndex = 0;
foreach (int number in numbers)
{
    Console.WriteLine($"Index: {numberIndex}, Value: {number}");
    numberIndex++;
}
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 number
$vbLabelText   $csharpLabel

Bu kodda, indeks değişkeni döngü başlamadan önce başlatılır ve ardından her yineleme sırasında döngü içinde artırılır. Bu yaklaşım çalışsa da, indeksi manuel olarak sürdürmeyi gerektirdiği için her zaman ideal değildir.

Yöntem 2: LINQ'un Select Yöntemini Kullanma

LINQ'un Select metodu, bir koleksiyonun her bir elemanını, indeksini de dahil ederek yeni bir forma 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}");
}
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 item
$vbLabelText   $csharpLabel

Bu örnekte, Select hem mevcut elemanın değerini hem de indeksini içeren anonim bir nesne oluşturur. foreach döngüsü daha sonra bu nesneler üzerinde yineleme yapabilir ve hem indeks hem de değere doğrudan erişebilir.

Yöntem 3: Özel Bir Yineleyici Kullanma

yield return anahtar kelimesini kullanarak özelleştirilmiş bir iterator genişletme yöntemi uygulayabilir ve bu yöntemle hem mevcut elemanı hem de indeksini veren bir metod üretebilirsiniz. Bu biraz daha ileri düzey bir konudur ancak 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++;
    }
}
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 Module
$vbLabelText   $csharpLabel

Şimdi, bu uzantı yöntemini koleksiyonlarınızla kullanabilirsiniz:

int[] numbers = { 10, 20, 30, 40 };
foreach (var (index, value) in numbers.WithIndex())
{
    Console.WriteLine($"Index: {index}, Value: {value}");
}
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}")
Next
$vbLabelText   $csharpLabel

Bu yaklaşım, manuel indeks yönetimini soyutlayarak ve yeniden kullanılabilir bir yönteme dönüştürerek indeks sorununa daha zarif bir çözüm sunar.

İndeksleri Erişmek için bir while Döngüsü Kullanma

Diziler veya listeler gibi koleksiyonlarla çalışıyorsanız, hem indeks hem de mevcut öğeye erişmek için bir indeks değişkeni ile birlikte bir while döngüsü kullanabilirsiniz:

int[] numbers = { 10, 20, 30, 40 };
int index = 0;
while (index < numbers.Length)
{
    Console.WriteLine($"Index: {index}, Value: {numbers[index]}");
    index++;
}
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
$vbLabelText   $csharpLabel

C# foreach ile indeks (Geliştiriciler İçin Nasıl Çalışır): Şekil 1 - İndeksler Çıkışı

Bu yöntem, indeksi bir dizi veya liste için alt komut olarak kullanarak hem indeks hem de mevcut öğeye doğrudan erişmenizi sağlar.

.NET'te Özel Koleksiyonlar ve Yineleyiciler Kullanma

Özelleştirilmiş koleksiyonlarla çalışıyorsanız, indeksli erişimi desteklemek için kendi yineleyicilerinizi uygulayabilirsiniz. IEnumerable arayüzünü implemente ederek ve yield return ifadesini kullanarak, hem elemana hem de indeksine geri dönen iteratorler 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();
    }
}
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 Class
$vbLabelText   $csharpLabel

Daha sonra bu özel koleksiyonu bir foreach döngüsü içinde kullanabilirsiniz:

var customCollection = new CustomCollection<int>(new int[] { 10, 20, 30, 40 });
foreach (int number in customCollection)
{
    Console.WriteLine(number);
}
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 number
$vbLabelText   $csharpLabel

GetEnumerator metodunu implemente ederek ve yield return kullanarak, .NET'teki herhangi bir koleksiyon gibi kendi özel koleksiyonunuzla da çalışabilen bir foreach döngüsü için bir iterator oluşturursunuz.

Anahtar-Değer Çiftleriyle Sözlükleri Kullanma ve Yineleme Yapma

Sözlüklerle çalışırken, foreach döngüsü anahtar-değer çiftleri üzerinde doğrudan yineleme yapmanıza olanak tanır. Bu, her yineleme sırasında anahtar ve değere erişmenin yaygın bir kullanım durumudur:

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}");
}
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 kvp
$vbLabelText   $csharpLabel

Bu örnekte, kvp.Key size mevcut anahtarı ve kvp.Value size mevcut değeri verir.

IronPDF Kullanarak C# foreach Döngüsü ve İndeks

C# foreach ile indeks (Geliştiriciler İçin Nasıl Çalışır): Şekil 2 - IronPDF

IronPDF, C#'da HTML'den PDF üretme ve diğer PDF ile ilgili görevleri ele almak için bir PDF kütüphanesidir. Ayrıca en son .NET Framework ile uyumludur. IronPDF kullanarak PDF'ler oluştururken, bir veri koleksiyonu üzerinde yineleme yapmanız ve içeriklerini PDF dosyanıza dinamik olarak eklemeniz gerekebilir. İndeks yönetimi ile birleştirilmiş foreach döngüsü, koleksiyonunuzdaki mevcut öğenin indeksine dayalı olarak konumlandırma, numaralandırma veya özel mantık yönetimi yapmanıza olanak tanır. İşte koleksiyondaki her öğenin belgede indeksleriyle birlikte yerleştirildiği bir PDF oluşturmak için IronPDF kullanmanı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.");
    }
}
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
Friend 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
$vbLabelText   $csharpLabel

İşte çıktı PDF dosyası:

C# foreach ile indeks (Geliştiriciler İçin Nasıl Çalışır): Şekil 3 - PDF Çıkışı

Sonuç

C# foreach ile indeks (Geliştiriciler İçin Nasıl Çalışır): Şekil 4 - Lisanslama

C#'da, foreach döngüsü koleksiyonlar üzerinde yineleme yapmanın uygun bir yolu olsa da, indeksleme için yerel destekten yoksundur. Ancak, bu sınırlamanın üstesinden gelmenin birkaç yolu vardır. Basit bir indeks değişkeni, LINQ'un Select metodu veya özel iteratorler kullanmanız durumunda, döngü sırasında mevcut veya sonraki elemanın indeksine erişim sağlayabilirsiniz. Bu teknikleri anlamak, özellikle her öğenin indeksini bilmeniz gerektiğinde foreach döngüsünü daha verimli kullanmanıza yardımcı olabilir.

IronPDF ile hemen karar vermeniz gerekmez. Yazılımın yeteneklerini kapsamlı bir şekilde keşfetmenize olanak tanıyan bir ücretsiz deneme sunuyoruz. Gördüklerinizi beğendiyseniz, lisanslar $799'ten başlıyor.

Sıkça Sorulan Sorular

C# foreach döngüsünde elemanların indeksini nasıl takip edebilirim?

C# foreach döngüsünde indeksi takip etmek için ayrı bir indeks değişkenini manuel olarak artırabilir, LINQ'un Select metodunu kullanarak elemanları indeksleriyle birlikte projelendirebilir veya eleman ve indeksini veren özel bir yineleyici oluşturabilirsiniz.

LINQ Select metodu nedir ve indekslemeye nasıl yardımcı olur?

LINQ Select metodu, bir koleksiyondaki her elemanı, elemanın indeksini içeren yeni bir forma dönüştürebilir. Bu projeksiyon, döngü sırasında eleman ve indeksine erişmenizi sağlar.

C#'da indeksleme için özel bir yineleyici nasıl oluşturabilirim?

C#'da özel bir yineleyici, yield return anahtar kelimesi kullanılarak oluşturulabilir. Bu, bir koleksiyon üzerinde yinelemeler yapıp hem mevcut elemanı hem de indeksini veren bir metod oluşturmanıza olanak tanır, bu da döngü indekslemesini basitleştirir.

Bir PDF kütüphanesi C#'da indeksli içerik oluşturmaya yardımcı olabilir mi?

Evet, IronPDF gibi bir PDF kütüphanesi, bir C# foreach döngüsü ile veri koleksiyonları üzerinde iterasyon yapmanıza ve indeksli içeriği bir PDF'e eklemenize yardımcı olabilir. Bu yaklaşım, dinamik içerik konumlandırması ve hassas indeksleme sağlar.

Bir foreach döngüsü kullanarak C#'da nasıl bir sözlük üzerinde işlem yaparım?

C#'da bir foreach döngüsü, her anahtar-değer çifti erişimi sağlayarak bir sözlük üzerinden iterasyon yapabilir. Bu, geliştiricilerin iterasyon işlemi sırasında hem anahtarlar hem de değerlerle doğrudan çalışmasına olanak tanır.

C# geliştirmede PDF kütüphanelerinin faydaları nelerdir?

PDF kütüphaneleri, geliştirilmiş HTML'den PDF'ler oluşturmanıza ve C#'da çeşitli PDF işlemleri yapmanıza olanak tanır. Özellikleri keşfetmek için genellikle ücretsiz denemeler sunarlar, lisanslar ise satın alınabilir.

C#'da indekslenmiş yineleme için while döngüsü nasıl kullanılır?

While döngüsü, indeks değişkeni ile koleksiyonlar üzerinde iterasyon yapmak için kullanılabilir, indeksi bir alt simge olarak kullanarak hem indekse hem de mevcut elemana erişim sağlar.

Jacob Mellor, Teknoloji Direktörü @ Team Iron
Chief Technology Officer

Jacob Mellor, Iron Software'in Teknoloji Müdürü ve C# PDF teknolojisinin öncüsü olan vizyoner bir mühendis. Iron Software’in temel kod tabanının ilk geliştiricisi olarak, şirketin ürün mimarisini kuruluşundan bu yana şekillendirdi ve CEO Cameron Rimington ile birlikte NASA, Tesla ve ...

Daha Fazlasını Oku

Iron Destek Ekibi

Haftanın 5 günü, 24 saat çevrimiçiyiz.
Sohbet
E-posta
Beni Ara