跳至頁尾內容
.NET 幫助

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

在這個範例中,數字代表每次迭代時集合的元素。 循環會自動遍歷陣列中的所有元素。 然而,沒有內建的方式可以存取目前元素的索引。

在 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++;
}
$vbLabelText   $csharpLabel

在此程式碼中,索引變數會在循環開始前初始化,然後在每次迭代時在循環內遞增。 雖然這種方法可行,但需要手動維護索引,這並不總是理想的做法。

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

在這個範例中,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++;
    }
}
$vbLabelText   $csharpLabel

現在,您可以將此延伸方法用於您的作品集:

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

此方法透過將手動索引管理抽象為可重複使用的方法,為有索引的 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++;
}
$vbLabelText   $csharpLabel

C# foreach with index (How It Works For Developers):圖 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();
    }
}
$vbLabelText   $csharpLabel

然後您就可以在 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);
}
$vbLabelText   $csharpLabel

透過實作 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}");
}
$vbLabelText   $csharpLabel

在這個範例中,kvp.Key 會提供您目前的 key,而 kvp.Value 則會提供您目前的 value。

使用 IronPDF 與 C# foreach 環路和索引。

C# foreach with index (How It Works For Developers):圖 2 - IronPdf

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

以下是輸出的 PDF 檔案:

C# foreach with index (How It Works For Developers):圖 3 - PDF 輸出

結論

C# foreach with index (How It Works For Developers):圖 4 - 授權

在 C# 中,foreach 環路雖然是迭代集合的方便方式,但卻缺乏對索引的原生支援。 然而,有幾種方法可以克服這個限制。 無論您是使用簡單的索引變數、LINQ 的 Select 方法,或是自訂的迭代器,您都可以在迭代過程中存取目前或下一個元素的索引。 了解這些技術可以幫助您更有效率地使用 foreach 循環,尤其是當您需要知道每個元素的索引時。

有了 IronPDF,您不必立即投入工作。 我們提供 免費試用,讓您深入探索軟體的功能。 如果您喜歡您所看到的,許可證的起價為 $799 。

常見問題解答

如何在 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 迴圈進行索引迭代?

在 C# 中,可以使用 while 迴圈和索引變數來遍歷集合,透過將索引用作下標來存取索引和當前元素。

Jacob Mellor,Team Iron 首席技術官
首席技術長

Jacob Mellor 是 Iron Software 的首席技術官,也是一位富有遠見的工程師,率先開發了 C# PDF 技術。作為 Iron Software 核心程式碼庫的最初開發者,他自公司成立之初便參與塑造了其產品架構,並與執行長 Cameron Rimington 一起將其發展成為一家擁有 50 多名員工、服務於 NASA、特斯拉和全球政府機構的公司。

Jacob 於 1998 年至 2001 年在曼徹斯特大學獲得土木工程一級榮譽學士學位。 1999 年,他在倫敦創辦了自己的第一家軟體公司;2005 年,他創建了自己的第一個 .NET 元件。此後,他專注於解決微軟生態系統中的複雜問題。

他的旗艦產品 IronPDF 和 IronSuite .NET 庫在全球 NuGet 上的安裝量已超過 3000 萬次,其基礎程式碼持續為全球開發者工具提供支援。憑藉 25 年的商業經驗和 41 年的程式設計專長,Jacob 始終致力於推動企業級 C#、Java 和 Python PDF 技術的創新,同時指導下一代技術領導者。