理解 C# 列表
C#中的List類別,是一種多功能的集合類型。 它基於動態陣列作為內部數據結構,允許高效地操作元素。 當您創建一個List時,可以指定一個默認的初始容量以從一開始就優化記憶體使用。 這個容量指的是列表在不重新分配記憶體的情況下可以初始存放的元素數。
在Layla Porter的影片"C# 初學者教學第7部分 - 使用LINQ查詢數據"中,她深入探討了C#列表的功能,並演示如何利用LINQ(語言整合查詢)來有效查詢數據。 本文分解了Layla影片中的關鍵概念和實例,提供了對於C#列表的全面理解,適合初學者。
C#列表介紹
正如Layla在影片開始(0:03)所提到的,C#列表是一種多用途的數據結構,允許開發者存儲和操作元素集合。 與陣列不同,列表可以動態調整大小,這使其非常適合用於未知元素數量的場合。
使用List是直觀的。 您可以使用Add方法添加元素,該方法將指定的對象附加到列表的末尾。列表使用零基於索引,這意味著第一個元素在索引0處訪問。您也可以使用方括號([])符號指定索引來訪問元素。
要遍歷列表,可以使用foreach迴圈,它會按出現順序遍歷每個元素。 如果您需要查找特定元素的第一次出現,可以使用如IndexOf的方法與謂詞進行查找,這是基於指定的條件進行的搜索。
List是強類型的,意味著它包含特定類型(T)的對象。 這確保了類型安全,並使得可以使用由指定對象類型定義的方法和屬性。 默認情況下,List使用默認的哈希函數來高效排列元素。
讓我們深入了解Layla在她的影片中演示的List工作和List類別方法。
創建列表
在C#中創建列表時,您可以設置指定的初始容量來優化內部數據結構。 列表是多功能的,可以從指定的元素集合中初始化。 您可以使用int索引訪問項目,並使用foreach迴圈遍歷它們。與字典不同,列表不依賴默認的哈希函數,而且它們存儲強類型的對象,確保了類型安全和數據管理的一致性。
在(0:44),Layla創建了一個起司列表,展示如何初始化和填充列表。在C#中,可以使用List類創建列表,其中T代表列表中包含的元素類型。
List<Cheese> cheeseList = new List<Cheese>
{
new Cheese(1, "Stilton", 3.0m, 5),
new Cheese(2, "Cheddar", 2.25m, 3),
new Cheese(3, "Pineapple", 3.5m, 1),
new Cheese(4, "Brie", 5.5m, 2),
new Cheese(5, "Roquefort", 3.5m, 5),
};
List<Cheese> cheeseList = new List<Cheese>
{
new Cheese(1, "Stilton", 3.0m, 5),
new Cheese(2, "Cheddar", 2.25m, 3),
new Cheese(3, "Pineapple", 3.5m, 1),
new Cheese(4, "Brie", 5.5m, 2),
new Cheese(5, "Roquefort", 3.5m, 5),
};
在上面的例子中,Layla使用集合初始化語法創建了一個Cheese對象。 她為每個對應於Cheese類的起司對象指定了ID、名稱、價格和強度等屬性,演示了在C#中列表的創建和初始化。
遍歷起司列表以打印ID和名稱
Layla Porter演示如何使用foreach迴圈來遍歷cheeseList並僅打印每個起司的ID和名稱。 以下是代碼及其解釋:
foreach (var cheese in cheeseList)
{
Console.WriteLine($"ID: {cheese.ID}, Name: {cheese.Name}");
}
foreach (var cheese in cheeseList)
{
Console.WriteLine($"ID: {cheese.ID}, Name: {cheese.Name}");
}
在上述代碼中,Layla使用foreach迴圈來遍歷cheeseList。 這會打印出列表中的所有元素。迴圈遍歷列表中的每個Cheese對象。在每次迭代中,變量cheese持有當前位於指定索引的Cheese對象。 使用Console.WriteLine,她打印每個起司元素的ID和Name屬性,顯示如何從C#中的列表訪問和顯示特定元素。
使用LINQ查詢查找起司
在影片的2:45,Layla Porter演示如何根據用戶輸入使用LINQ查找特定的起司。 她使用ReadLine方法從用戶獲取起司名稱:
string cheeseName = Console.ReadLine();
string cheeseName = Console.ReadLine();
在列表中搜尋項目時,Layla在2:51強調了一個非常重要的關鍵點。她說,如果不使用LINQ,就必須手動遍歷集合中的每個起司以找到符合用戶輸入的名稱,但LINQ的輔助函式庫在幕後處理此過程,讓這一過程非常高效。 以下代碼片段展示了Layla(3:40)如何僅使用LINQ查詢語法而不使用for迴圈來遍歷列表元素:
if (cheeseList.Any(cheese => cheese.Name == cheeseName))
{
Cheese cheese = cheeseList.FirstOrDefault(c => c.Name == cheeseName);
Console.WriteLine($"{cheese.Name} cheese costs £{cheese.Price.ToString()} and has a strength of {cheese.Strength}.");
}
else
{
Console.WriteLine("I'm sorry, we don't have that cheese.");
}
if (cheeseList.Any(cheese => cheese.Name == cheeseName))
{
Cheese cheese = cheeseList.FirstOrDefault(c => c.Name == cheeseName);
Console.WriteLine($"{cheese.Name} cheese costs £{cheese.Price.ToString()} and has a strength of {cheese.Strength}.");
}
else
{
Console.WriteLine("I'm sorry, we don't have that cheese.");
}
在上述代碼中:
-
Layla解釋說,與其手動遍歷列表,還不如使用LINQ進行更高效的搜尋。
Any方法檢查列表中是否有任何起司名稱與用戶輸入相符。 -
如果找到匹配,則意味著該元素存在,
FirstOrDefault方法檢索第一個符合輸入名稱的起司。 此方法是安全的,因為如果未找到匹配,則返回null,從而防止潛在的錯誤。 - 如果找到了起司,則會打印其名稱、價格和強度。 如果沒有,則會顯示一條指示找不到起司的消息。
此方法展示了在C#中使用LINQ搜尋集合的效率和簡單性。 代碼片段的輸出顯示在7:19:(比下面的更好的圖片嗎?)

搜尋時處理大小寫敏感性
在處理字符串時,Layla在8:00提醒記住它們對大小寫敏感。為了確保我們的起司名比較對大小寫不敏感,我們需要使用.ToLower()方法將用戶輸入和我們列表中的起司名都轉換成小寫。 這讓用戶可以輸入任何形式的大小寫,而我們的程式仍然可以正確地找到匹配的起司。 只需記住字符串的大小寫敏感性可能會很棘手,因此妥善處理至關重要。
實際示例:按強度查詢起司
在(8:50),Layla創建了一個實用的例子,其中用戶可以按起司的強度來篩選,演示如何將用戶輸入與LINQ查詢結合。
1. 用戶輸入提示和讀取
Console.WriteLine("What strength cheese are you interested in - choose between 1 and 5");
string strengthString = Console.ReadLine();
Console.WriteLine("What strength cheese are you interested in - choose between 1 and 5");
string strengthString = Console.ReadLine();
Layla在9:05,首先要求用戶選擇一個在1到5之間的強度值。這是通過一個簡單的Console.ReadLine()來取得用戶輸入。
2. 將輸入轉換為整數
bool isInt = int.TryParse(strengthString, out int strength);
bool isInt = int.TryParse(strengthString, out int strength);
接下來在9:16,她確保用戶輸入的是一個實際的數字。 她建議使用int.TryParse來實現這一點。 如果輸入檢查合格並成功轉換為整數,那就很好! 如果不行,我們也可以從容應對。
3. 按強度篩選起司
List<Cheese> cheeseByStrength = cheeseList.Where(c => c.Strength == strength).ToList();
List<Cheese> cheeseByStrength = cheeseList.Where(c => c.Strength == strength).ToList();
在Layla影片的10:25,現在是有趣的部分。她展示如何使用LINQ篩選cheeseList中的起司列表。 使用LINQ的(c => c.Strength == strength),她篩選出符合用戶選擇強度的起司。 這給了我們一個新的列表,cheeseByStrength。
4. 輸出篩選後的起司
foreach (var cheese in cheeseByStrength)
{
Console.WriteLine($"Name: {cheese.Name} cheese");
}
foreach (var cheese in cheeseByStrength)
{
Console.WriteLine($"Name: {cheese.Name} cheese");
}
最後在12:03,為了完整收尾,Layla使用foreach迴圈遍歷Console.WriteLine打印出其名稱。 簡單而有效!
在12:17,Layla演示了用戶如何輸入一個強度值,而列表則篩選後只顯示具有指定強度的起司。 範例輸出展示在下方:(更好的圖片嗎?)

結論
Layla的影片有效地介紹了C#列表的概念以及如何使用LINQ查詢它們。 通過學習她的實例和解釋,初學者可以在使用列表和查詢C#中的數據方面獲得堅實的基礎。 欲看更多詳情和現場編碼會話,請查看Layla的Youtube 頻道并參加她的現場直播。
請記得探究List類的各種方法和屬性,例如Insert方法、謂詞函數等等,以增強您對列表的理解和有效操作能力。


