了解如何使用 C# 中的清單 <T> 來管理資料收集

此入門教學課程提供 C# 語言的簡介,以及 List<T> 類別的基礎知識。

必要條件

此教學課程預期您已設定機器以進行本機開發。 如需安裝指示和 .NET 中應用程式開發的概觀,請參閱 設定本機環境

如果您想要在不需要設定本機環境的情況下執行程式碼,請參閱此教學課程的互動式瀏覽器版本

基本的清單範例

建立名為 list-tutorial 的目錄。 將該目錄設為目前的目錄,並執行 dotnet new console

重要

.NET 6 的 C# 範本會使用 最上層語句。 如果您已經升級至 .NET 6,您的應用程式可能不符合本文中的程式碼。 如需詳細資訊,請參閱新 C# 範本產生最上等級陳述式一文

.NET 6 SDK 也會為使用下列 SDK 的專案新增一組隱含global using 指示詞:

  • Microsoft.NET.Sdk
  • Microsoft.NET.Sdk.Web
  • Microsoft.NET.Sdk.Worker

這些隱含 global using 指示詞包含該專案型別最常見的命名空間。

如需詳細資訊,請參閱隱含 using 指示詞的文章

在您最愛的編輯器中開啟 Program.cs,並以下列內容取代現有的程式碼:

List<string> names = ["<name>", "Ana", "Felipe"];
foreach (var name in names)
{
    Console.WriteLine($"Hello {name.ToUpper()}!");
}

以您的名稱取代 <name>。 儲存 Program.cs。 在主控台視窗中輸入 dotnet run 來嘗試它。

您已建立字串清單,在該清單中新增三個名稱,並以全部大寫的形式列印那些名稱。 您會使用從先前教學課程中學習到的概念,在清單中執行迴圈。

顯示名稱的程式碼會運用字串內插補點功能。 當您在 string 的前方放置 $ 時,您可以在字串宣告中內嵌 C# 程式碼。 實際的字串會以它所產生的值取代 C# 程式碼。 在此範例中,它會以每個 (轉換成大寫字母的) 名稱取代 {name.ToUpper()},因為您呼叫了 ToUpper 方法。

讓我們繼續探索。

修改清單內容

您所建立的集合會使用 List<T> 類型。 此類型會儲存元素的序列。 您會在角括弧之間指定元素的類型。

List<T> 類型的其中一個重要層面,在於它可以擴張或縮小,使您可以新增或移除元素。 在程式結尾新增此程式碼:

Console.WriteLine();
names.Add("Maria");
names.Add("Bill");
names.Remove("Ana");
foreach (var name in names)
{
    Console.WriteLine($"Hello {name.ToUpper()}!");
}

您已在清單末端新增兩個額外的名稱。 您也移除了一個名稱。 儲存檔案,並輸入 dotnet run 來嘗試它。

List<T> 也可讓您透過索引參考個別的項目。 您需將索引放在 [] 語彙基元之間,位於清單名稱之後。 C# 使用 0 作為第一個索引。 將下列程式碼新增至您剛才新增的程式碼下方,然後嘗試它:

Console.WriteLine($"My name is {names[0]}");
Console.WriteLine($"I've added {names[2]} and {names[3]} to the list");

您無法存取位於清單結尾之外的索引。 請記住,索引是從 0 開始,因此最大的有效索引數目為清單項目數目減去 1。 您可以使用 Count 屬性檢查清單的長度。 您的程式結尾,加入下列程式碼:

Console.WriteLine($"The list has {names.Count} people in it");

儲存檔案,然後再次輸入 dotnet run 以查看結果。

針對清單進行搜尋和排序

我們的範例所使用的清單相對較小,但是您的應用程式可能經常會建立具有更多元素的清單,數量甚至會達數千個之多。 若要在這些較大的集合中尋找元素,您需要在清單中搜尋不同的項目。 IndexOf 方法會搜尋項目,並傳回該項目的索引。 如果項目不在清單中,則 IndexOf 傳回 -1。 將下列程式碼新增到程式的底部:

var index = names.IndexOf("Felipe");
if (index == -1)
{
    Console.WriteLine($"When an item is not found, IndexOf returns {index}");
}
else
{
    Console.WriteLine($"The name {names[index]} is at index {index}");
}

index = names.IndexOf("Not Found");
if (index == -1)
{
    Console.WriteLine($"When an item is not found, IndexOf returns {index}");
}
else
{
    Console.WriteLine($"The name {names[index]} is at index {index}");

}

也可以對您清單中的項目進行排序。 Sort 方法會依項目的一般順序方式,對清單中的所有項目進行排序 (對字串會依字母順序排列)。 將下列程式碼新增到程式的底部:

names.Sort();
foreach (var name in names)
{
    Console.WriteLine($"Hello {name.ToUpper()}!");
}

儲存檔案並輸入 dotnet run 以嘗試此最新版本。

在開始下一節之前,讓我們將目前的程式碼移到另一個個別的方法。 這可讓您更輕鬆地開始處理新的範例。 將所有您撰寫的程式碼放在名為 WorkWithStrings() 的新方法中。 在程式頂端呼叫該方法。 完成時,您的程式碼看起來應該像這樣:

WorkWithStrings();

void WorkWithStrings()
{
    List<string> names = ["<name>", "Ana", "Felipe"];
    foreach (var name in names)
    {
        Console.WriteLine($"Hello {name.ToUpper()}!");
    }

    Console.WriteLine();
    names.Add("Maria");
    names.Add("Bill");
    names.Remove("Ana");
    foreach (var name in names)
    {
        Console.WriteLine($"Hello {name.ToUpper()}!");
    }

    Console.WriteLine($"My name is {names[0]}");
    Console.WriteLine($"I've added {names[2]} and {names[3]} to the list");

    Console.WriteLine($"The list has {names.Count} people in it");

    var index = names.IndexOf("Felipe");
    if (index == -1)
    {
        Console.WriteLine($"When an item is not found, IndexOf returns {index}");
    }
    else
    {
        Console.WriteLine($"The name {names[index]} is at index {index}");
    }

    index = names.IndexOf("Not Found");
    if (index == -1)
    {
        Console.WriteLine($"When an item is not found, IndexOf returns {index}");
    }
    else
    {
        Console.WriteLine($"The name {names[index]} is at index {index}");

    }

    names.Sort();
    foreach (var name in names)
    {
        Console.WriteLine($"Hello {name.ToUpper()}!");
    }
}

其他類型的清單

到目前為止,您都是使用清單中的 string 類型。 讓我們使用不同的類型建立 List<T>。 讓我們來建置一組數字。

在您呼叫 WorkWithStrings() 之後,請將下列項目新增至您的程式:

List<int> fibonacciNumbers = [1, 1];

這將會建立整數清單,並將前兩個整數設定為 1 的值。 這是費氏數列的前兩個值。 這兩個值之後每個費式數列數字,都會是其前兩個數字的總和。 新增下列程式碼:

var previous = fibonacciNumbers[fibonacciNumbers.Count - 1];
var previous2 = fibonacciNumbers[fibonacciNumbers.Count - 2];

fibonacciNumbers.Add(previous + previous2);

foreach (var item in fibonacciNumbers)
{
    Console.WriteLine(item);
}

儲存檔案並輸入 dotnet run 來查看結果。

提示

若要僅專注於本節的內容,您可以對呼叫 WorkWithStrings(); 的程式碼進行註解化。 請在該呼叫之前放置兩個 / 字元,例如:// WorkWithStrings();

挑戰

看看您是否可以結合運用來自此課程和先前課程的概念。 請依費式數列數字,擴展您到目前為止所建立的內容。 請嘗試將程式碼撰寫成可產生該數列的前 20 個數字。 (小提示:第 20 個費式數列數字為 6765)。

完成挑戰

您可以參考GitHub 上完成之範例程式碼的範例解決方案。

在迴圈每次反覆運算時,您都必須取清單中的最後兩個整數,將它們加總,並將該值新增至清單。 迴圈會持續重複,直到將 20 個項目新增至清單為止。

恭喜,您已完成清單的教學課程。 您可以在自己的開發環境中,繼續進行其他教學課程。

您可以在 .NET 基本概念文章中深入瞭解 List 集合的 型別。 您也能學習到許多其他的集合類型。