了解如何使用 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
集合的 型別。 您也能學習到許多其他的集合類型。