.NET-HILFE

C# foreach mit Index (Wie es für Entwickler funktioniert)

Veröffentlicht 23. Oktober 2024
Teilen Sie:

In C# wird dieforeach-Anweisung wird normalerweise verwendet, um über Sammlungen wie Arrays, Listen oder andere aufzählbare Typen zu iterieren. Eine Einschränkung ist jedoch, dass die foreach-Schleife keine eingebaute Indexvariable bietet, um die aktuelle Iteration zu verfolgen. Die Entwickler müssen häufig auf den Index des aktuellen Elements zugreifen. Im Folgenden werden wir verschiedene Möglichkeiten zur Implementierung dieser Funktionalität und dieIronPDF-Bibliothek.

Die Grundlagen der foreach-Schleife

Die foreach-Schleife wurde entwickelt, um die Iteration durch Arrays, Listen, Wörterbücher und andere Typen, die IEnumerable implementieren, zu vereinfachen. Hier ist ein einfaches Beispiel für die Verwendung einer foreach-Anweisung, um eine Schleife durch ein Array des Datentyps Integer zu ziehen:

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
VB   C#

In diesem Beispiel steht die Zahl für das Element der Sammlung während jeder Iteration. Die Schleife iteriert automatisch durch alle Elemente im Array. Es gibt jedoch keine integrierte Möglichkeit, auf den Index des aktuellen Elements zuzugreifen.

Umgang mit dem Index in einer foreach-Schleife

Obwohl C# den Index in einer foreach-Schleife nicht direkt zur Verfügung stellt, gibt es verschiedene Techniken, um dieses Problem zu lösen. Lassen Sie uns diese Methoden im Detail besprechen.

Methode 1: Verwendung einer separaten Variable

Eine der einfachsten Möglichkeiten, den Index des aktuellen Elements zu ermitteln, ist die Verwendung einer externen Indexvariablen. Sie müssen sie innerhalb der Schleife manuell inkrementieren:

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
VB   C#

In diesem Code wird die Indexvariable vor dem Start der Schleife initialisiert und dann innerhalb der Schleife bei jeder Iteration inkrementiert. Dieser Ansatz funktioniert zwar, erfordert aber die manuelle Pflege des Indexes, was nicht immer ideal ist.

Methode 2: Verwendung der Select-Methode von LINQ

Die Select-Methode von LINQ kann verwendet werden, um jedes Element einer Auflistung in eine neue Form zu projizieren, einschließlich seines Index. Hier ist ein Beispiel:

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
VB   C#

In diesem Beispiel erstellt Select ein anonymes Objekt, das sowohl den Wert des aktuellen Elements als auch dessen Index enthält. Die foreach-Schleife kann dann über diese Objekte iterieren und sowohl auf den Index als auch auf den Wert direkt zugreifen.

Methode 3: Verwendung eines benutzerdefinierten Iterators

Sie können eine benutzerdefinierte Iterator-Erweiterungsmethode mit dem Schlüsselwort yield return implementieren, um eine Methode zu erzeugen, die sowohl das aktuelle Element als auch dessen Index liefert. Diese Übersetzung ist etwas anspruchsvoller, bietet aber eine flexible Lösung.

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++;
    }
}
<System.Runtime.CompilerServices.Extension> _
Public Function WithIndex(Of T)(ByVal 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 value
End Function
VB   C#

Jetzt können Sie diese Erweiterungsmethode für Ihre Sammlungen verwenden:

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
VB   C#

Dieser Ansatz schafft eine elegantere Lösung für das foreach mit Index-Problem, indem die manuelle Indexverwaltung in eine wiederverwendbare Methode abstrahiert wird.

Verwendung einer while-Schleife für den Zugriff auf Indizes

Wenn Sie mit Sammlungen wie Arrays oder Listen arbeiten, können Sie eine while-Schleife in Verbindung mit einer Indexvariablen verwenden, um sowohl auf den Index als auch auf das aktuelle Element zuzugreifen:

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
VB   C#

C# foreach mit Index (Wie es für Entwickler funktioniert): Abbildung 1 - Ausgabe von Indizes

Mit dieser Methode können Sie sowohl auf den Index als auch auf das aktuelle Element direkt zugreifen, indem Sie die Indexvariable als Subscript für das Array oder die Liste verwenden.

Benutzerdefinierte Sammlungen und Iteratoren in .NET

Wenn Sie mit benutzerdefinierten Sammlungen arbeiten, können Sie Ihre Iteratoren so implementieren, dass sie indizierten Zugriff unterstützen. Durch die Implementierung der IEnumerable-Schnittstelle und die Verwendung der yield return-Anweisung können Sie Iteratoren erstellen, die sowohl das Element als auch dessen Index zurückgeben.

Hier ist ein Beispiel für die Erstellung einer benutzerdefinierten Sammlung, die IEnumerable implementiert:

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();
    }
}
Public Class CustomCollection(Of T)
	Implements IEnumerable(Of T)

	Private _items() As T
	Public Sub New(ByVal items() As T)
		_items = items
	End Sub
	Public Iterator Function GetEnumerator() As IEnumerator(Of T) Implements IEnumerable(Of T).GetEnumerator
		For i As Integer = 0 To _items.Length - 1
			Yield _items(i)
		Next i
	End Function
	Private Iterator Function IEnumerable_GetEnumerator() As IEnumerator Implements IEnumerable.GetEnumerator
		Return GetEnumerator()
	End Function
End Class
VB   C#

Sie können diese benutzerdefinierte Sammlung dann in einer foreach-Schleife verwenden:

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
VB   C#

Durch die Implementierung der GetEnumerator-Methode und die Verwendung von yield return erstellen Sie einen Iterator, der es der foreach-Schleife ermöglicht, mit Ihrer benutzerdefinierten Sammlung wie mit jeder anderen Sammlung in .NET zu arbeiten.

Verwendung von Wörterbüchern und Iteration mit Schlüssel-Werte-Paaren

Wenn Sie mit Wörterbüchern arbeiten, können Sie mit der foreach-Schleife direkt über Schlüssel-Wert-Paare iterieren. Dies ist ein häufiger Anwendungsfall für den Zugriff auf den Schlüssel und den Wert während jeder Iteration:

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
VB   C#

In diesem Beispiel gibt kvp.Key den aktuellen Schlüssel und kvp.Value den aktuellen Wert an.

Verwendung von IronPDF mit C# foreach-Schleife und Index

C# foreach mit Index (Wie es für Entwickler funktioniert): Abbildung 2 - IronPDF

IronPDF ist eine PDF-Bibliothek zur Verarbeitung vonPDF-Erzeugung aus HTML und andere PDF-bezogene Aufgaben in C#. Sie ist auch mit dem neuesten .NET Framework kompatibel. Bei der Erstellung von PDFs mit IronPDF müssen Sie möglicherweise über eine Sammlung von Daten iterieren und Inhalte dynamisch in Ihre PDF-Datei einfügen. Durch die Kombination der foreach-Schleife mit der Indexverarbeitung können Sie die Positionierung, Nummerierung oder benutzerdefinierte Logik basierend auf dem Index des aktuellen Elements in der Sammlung verwalten. Hier ein praktisches Beispiel für die Verwendung von IronPDF zur Erstellung eines PDF-Dokuments, bei dem jedes Element einer Sammlung zusammen mit seinem Index in das Dokument eingefügt wird.

using IronPdf;
class Program
{
    static void Main(string[] args)
    {
        // Create a new PDF document
        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
        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
		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
VB   C#

Hier ist die ausgegebene PDF-Datei:

C# foreach mit Index (Wie es für Entwickler funktioniert): Abbildung 3 - PDF-Ausgabe

Schlussfolgerung

C# foreach mit Index (Wie es für Entwickler funktioniert): Abbildung 4 - Lizenzierung

In C# ist die foreach-Schleife zwar ein bequemer Weg, um über Sammlungen zu iterieren, aber es fehlt die native Unterstützung für die Indizierung. Es gibt jedoch mehrere Möglichkeiten, diese Einschränkung zu überwinden. Ob Sie eine einfache Indexvariable, die Select-Methode von LINQ oder benutzerdefinierte Iteratoren verwenden, Sie können während der Iteration auf den Index des aktuellen oder nächsten Elements zugreifen. Das Verständnis dieser Techniken kann Ihnen helfen, die foreach-Schleife effizienter zu nutzen, insbesondere wenn Sie den Index jedes Elements kennen müssen.

Mit IronPDF müssen Sie sich nicht sofort festlegen. Wir bieten einekostenloser Test die es Ihnen ermöglicht, die Möglichkeiten der Software eingehend zu erkunden. Wenn Ihnen gefällt, was Sie sehen, beginnen die Lizenzen bei $749.

< PREVIOUS
C# Indexers (Wie es für Entwickler funktioniert)
NÄCHSTES >
Socket io .NET (Wie es für Entwickler funktioniert)

Sind Sie bereit, loszulegen? Version: 2024.12 gerade veröffentlicht

Gratis NuGet-Download Downloads insgesamt: 11,810,873 Lizenzen anzeigen >