C# foreach與索引(對開發者如何理解的工作)
在 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
在這個例子中,number 表示每次迭代期間集合中的元素。 循環會自動遍歷陣列中的所有元素。 然而,沒有內建的方式可以存取目前元素的索引。
在 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
在此程式碼中,索引變數會在循環開始前初始化,然後在每次迭代時在循環內遞增。 雖然這種方法可行,但需要手動維護索引,這並不總是理想的做法。
方法 2:使用 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
在這個例子中,Select 建立一個匿名對象,其中包含目前元素的值及其索引。 然後,foreach 環路可以遍歷這些物件,並直接存取索引和數值。
方法 3:使用自訂迭代器
您可以使用 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++;
}
}
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
現在,您可以將此延伸方法用於您的作品集:
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
此方法透過將手動索引管理抽象為可重複使用的方法,為有索引的 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

透過使用索引變數作為陣列或清單的下標,此方法可讓您直接存取索引和目前的元素。
.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();
}
}
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
然後您就可以在 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
透過實作 GetEnumerator 方法並使用 yield return,您可以建立一個迭代器,使 foreach 迴圈能夠像 .NET 中的任何其他集合一樣處理您的自訂集合。
使用詞典和迭代鍵-值對。
在處理字典時,foreach 環路可讓您直接遍歷 key-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}");
}
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
在這個例子中,kvp.Key 給出當前鍵,而 kvp.Value 給出當前值。
使用 IronPDF 與 C# foreach 環路和索引。

IronPDF 是一個 PDF 函式庫,用來在 C# 中處理 PDF 從 HTML 產生以及其他 PDF 相關任務。 它也與最新的 .NET Framework 相容。 使用 IronPDF 生成 PDF 時,您可能需要遍历數据集合并将內容動态插入 PDF 文件。將 foreach 環路與索引處理結合,可讓您根據集合中當前項目的索引來管理定位、編號或自訂邏輯。 以下是使用 IronPDF 創建 PDF 的實用範例,其中集合中的每個項目都會連同其索引一起插入到文件中。
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
以下是輸出的 PDF 檔案:

結論

在 C# 中,foreach 環路雖然是迭代集合的方便方式,但卻缺乏對索引的原生支援。 然而,有幾種方法可以克服這個限制。 無論你使用簡單的索引變數、LINQ 中的 Select 方法,或是自訂迭代器,你都可以在迭代期間存取目前元素或下一個元素的索引。 了解這些技術可以幫助您更有效率地使用 foreach 循環,尤其是當您需要知道每個元素的索引時。
有了 IronPDF,您不必立即投入工作。 我們提供 免費試用,讓您深入探索軟體的功能。 如果您喜歡您所看到的,許可證從 $999 開始。
常見問題解答
如何在 C# foreach 迴圈中追蹤元素的索引?
要在 C# foreach 迴圈中追蹤索引,可以手動增量增加一個單獨的索引變量,使用 LINQ 的 Select 方法來映射元素及其索引,或創建一個自訂迭代器以提供元素及其索引。
什麼是 LINQ Select 方法,它如何幫助索引?
LINQ 的 Select 方法可以將集合中的每個元素轉換為包括元素索引的新形式。此映射在 foreach 迴圈中允許同時訪問元素及其索引。
如何創建 C# 的自訂迭代器以進行索引?
C# 中的自訂迭代器可以使用 yield return 關鍵字來創建。這允許你建立一個方法,遍歷集合並提供當前元素和其索引,簡化迴圈索引。
PDF 庫可以幫助在 C# 中創建索引內容嗎?
是的,像 IronPDF 這樣的 PDF 庫可以與 C# foreach 迴圈配合使用,遍歷數據集合並將索引內容插入 PDF。此方法可以實現動態內容定位和精確索引。
如何使用 C# 中的 foreach 迴圈遍歷字典?
在 C# 中,foreach 迴圈可以通過訪問每個鍵值對來迭代字典。這允許開發者在迭代過程中直接處理鍵和值。
在 C# 開發中使用 PDF 庫有什麼好處?
PDF 庫使開發者可以從 HTML 生成 PDF 並在 C# 中執行各種 PDF 操作。它們通常提供免費試用版以探索功能,並提供可購買的許可證。
如何在 C# 中使用 while 迴圈進行索引迭代?
while 迴圈可以與索引變量一起使用,以便在 C# 中遍歷集合,利用索引用作下標來訪問索引和當前元素。



