.NET 幫助

C# foreach 與索引(開發者如何使用)

發佈 2024年10月23日
分享:

在 C# 中,foreach 語句通常用於遍歷集合,例如陣列、列表或其他可枚舉類型。不過,其中一個限制是,foreach 迴圈沒有提供內建的索引變數來追踪當前的迭代。 開發人員經常需要訪問當前元素的索引。 以下,我們將探討實現此功能的各種方法和IronPDF 庫.

foreach 迴圈的基礎知識

foreach 迴圈旨在簡化遍歷陣列、列表、字典以及其他實現 IEnumerable 的類型。 以下是一個基本示例,說明如何使用 foreach 語句來遍歷一個整數數組:

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#

在此範例中,數字表示每次迭代期間集合中的元素。 迴圈會自動遍歷陣列中的所有元素。 然而,沒有內建的方法可以存取當前元素的索引。

foreach 迴圈中處理索引

雖然 C# 在 foreach 迴圈中未直接提供索引,但有多種技術可以解決此問題。 讓我們詳細討論這些方法。

方法 1:使用單獨的變數

獲取當前元素索引的最簡單方法之一是使用外部索引變量。 您需要在迴圈內手動遞增它:

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#

在這段程式碼中,索引變數在迴圈開始之前被初始化,然後在每次迴圈迭代中增量。 雖然這種方法可行,但需要手動維護索引,這並不總是理想的。

方法二:使用 LINQ 的 Select 方法

LINQ 的 Select 方法可以用來將集合的每個元素投影為一種新形式,包括其索引。 這是個例子:

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#

在此範例中,Select 方法建立了一個匿名物件,其中包含當前元素的值及其索引。 接著,foreach 迴圈可以遍歷這些物件,並直接存取索引和值。

方法三:使用自訂迭代器

您可以使用 yield return 關鍵字實作一個自訂的迭代器擴展方法,以產生一個同時提供當前元素及其索引的方法。 這雖然稍微進階一點,但提供了一個靈活的解決方案。

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#

現在,您可以將此擴展方法用於您的集合:

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#

這種方法通過將手動索引管理抽象化到可重複使用的方法中,為包含索引的 foreach 問題創造了一個更優雅的解決方案。

使用 while 迴圈來存取索引

如果您正在處理諸如陣列或列表之類的集合,您可以使用 while 迴圈結合索引變數來同時訪問索引和當前元素:

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 與索引(開發人員如何運作):圖 1 - 索引輸出

此方法允許您直接使用索引變量作為數組或列表的下標來訪問索引和當前元素。

在 .NET 中的自定義集合和迭代器

如果您使用自定義集合,您可以實作自己的迭代器以支援索引存取。 通過實作 IEnumerable 介面並使用 yield return 語句,您可以建立返回元素及其索引的迭代器。

以下是建立實作 IEnumerable 的自訂集合的範例:

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#

然後,您可以在 foreach 迴圈中使用此自訂集合:

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#

透過實作 GetEnumerator 方法並使用 yield return,你可以創建一個迭代器,讓 foreach 迴圈能夠像處理 .NET 中的其他集合一樣操作你的自定義集合。

使用字典和鍵值對進行迭代

在使用字典時,foreach 循環允許您直接遍歷鍵值對。 這是一個在每次迭代中同時訪問鍵和值的常見用例:

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#

在此範例中,kvp.Key 提供您當前的鍵,而 kvp.Value 提供您當前的值。

在 C# 中搭配使用 IronPDF 與 foreach 迴圈與索引

C# foreach 搭配索引(開發人員如何使用):圖 2 - IronPDF

IronPDF 是一個用於處理 PDF 的庫從 HTML 生成 PDF以及其他與 PDF 相關的任務在 C# 中。 它也兼容最新的 .NET Framework。 在使用IronPDF生成PDF時,您可能需要遍歷數據集合並動態插入內容到您的PDF文件中。結合foreach循環與索引處理,您可以根據集合中當前項目的索引管理定位、編號或自定義邏輯。 以下是一個使用 IronPDF 創建 PDF 的實際範例,其中每個集合中的項目會與其索引一起插入到文件中。

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#

這是輸出 PDF 檔案:

C# foreach 與索引(開發者如何使用):圖 3 - PDF 輸出

結論

C# foreach 帶索引(開發者如何使用):圖 4 - 授權

在 C# 中,雖然 foreach 迴圈是遍歷集合的方便方式,但它缺乏對索引的原生支援。 然而,有幾種方法可以克服這一限制。 無論是使用簡單的索引變量、LINQ 的 Select 方法,還是自定義迭代器,您都可以在迭代過程中獲取當前或下一個元素的索引。 了解這些技巧可以幫助您更有效地使用 foreach 迴圈,特別是在需要知道每個元素的索引時。

使用 IronPDF,您不必立即承諾。 我們提供一個免費試用讓您深入探索該軟體的功能。 如果您喜歡所看到的內容,授權價格從 $749 開始。

< 上一頁
C# 索引器(為開發人員工作原理)
下一個 >
Socket io .NET(它如何為開發者運作)

準備開始了嗎? 版本: 2024.12 剛剛發布

免費 NuGet 下載 總下載次數: 11,622,374 查看許可證 >