在實際環境中測試
在生產環境中測試無浮水印。
在任何需要的地方都能運作。
在 C# 中,foreach 語句通常用於遍歷集合,例如陣列、列表或其他可枚舉類型。不過,其中一個限制是,foreach 迴圈沒有提供內建的索引變數來追踪當前的迭代。 開發人員經常需要訪問當前元素的索引。 以下,我們將探討實現此功能的各種方法和IronPDF 庫.
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
在此範例中,數字表示每次迭代期間集合中的元素。 迴圈會自動遍歷陣列中的所有元素。 然而,沒有內建的方法可以存取當前元素的索引。
foreach
迴圈中處理索引雖然 C# 在 foreach 迴圈中未直接提供索引,但有多種技術可以解決此問題。 讓我們詳細討論這些方法。
獲取當前元素索引的最簡單方法之一是使用外部索引變量。 您需要在迴圈內手動遞增它:
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
在這段程式碼中,索引變數在迴圈開始之前被初始化,然後在每次迴圈迭代中增量。 雖然這種方法可行,但需要手動維護索引,這並不總是理想的。
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 迴圈可以遍歷這些物件,並直接存取索引和值。
您可以使用 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
現在,您可以將此擴展方法用於您的集合:
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 迴圈結合索引變數來同時訪問索引和當前元素:
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
此方法允許您直接使用索引變量作為數組或列表的下標來訪問索引和當前元素。
如果您使用自定義集合,您可以實作自己的迭代器以支援索引存取。 通過實作 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
然後,您可以在 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 循環允許您直接遍歷鍵值對。 這是一個在每次迭代中同時訪問鍵和值的常見用例:
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 是一個用於處理 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
這是輸出 PDF 檔案:
在 C# 中,雖然 foreach 迴圈是遍歷集合的方便方式,但它缺乏對索引的原生支援。 然而,有幾種方法可以克服這一限制。 無論是使用簡單的索引變量、LINQ 的 Select 方法,還是自定義迭代器,您都可以在迭代過程中獲取當前或下一個元素的索引。 了解這些技巧可以幫助您更有效地使用 foreach 迴圈,特別是在需要知道每個元素的索引時。
使用 IronPDF,您不必立即承諾。 我們提供一個免費試用讓您深入探索該軟體的功能。 如果您喜歡所看到的內容,授權價格從 $749 開始。