← SEARCHABLE ARCHIVE
C# · 2026-08-02

C# 從基礎到精通 — 第 6 講

使用集合和 LINQ 運算數據

INTERACTIVE READING MODE →

該部落格上撰寫的文章是出於教學目的而創建的。 另外,文章中的資訊可能不正確,請謹慎。

遊戲和應用程式儲存、搜尋和排序大量資料。 根據目的選擇集合並使用 LINQ 表達處理意圖將導致更清晰的流程而不是更短的程式碼。

選擇收藏

var party = new List<Player>();
var itemById = new Dictionary<int, Item>();
var unlockedIds = new HashSet<int>();

itemById.Add(10, new Item(10, "Potion"));
unlockedIds.Add(10);

List適合有序列表,Dictionary適合key查找,HashSet適合判斷值是否存在並防止重複。 如果用索引器讀取字典中沒有的key,就會出現異常,所以可以使用TryGetValue。

使用 LINQ 查詢

List<Monster> targets = monsters
    .Where(monster => monster.IsAlive)
    .OrderBy(monster => monster.Health)
    .Take(3)
    .ToList();

選擇三個生命值較低的活體怪物的意圖從計算順序中就可見一斑。 LINQ 建立新的結果流,而不自動修改原始集合。

延遲執行

IEnumerable<Monster> alive = monsters.Where(monster => monster.IsAlive);

monsters.Add(new Monster());

foreach (Monster monster in alive)
{
    Console.WriteLine(monster.Health);
}

Where傳回的查詢通常在遍歷時執行。 如果中間原來的改變了,結果也可能會改變。若要修復目前結果,請立即使用 ToList() 進行計算。

檢查經常性費用

LINQ 呼叫不一定很慢,但它們可以建立迭代器、委託和結果集合。 對於每幀執行數千次的路徑,簡單循環和緩衝區重複使用可能更合適。

targets.Clear();
foreach (Monster monster in monsters)
{
    if (monster.IsAlive)
    {
        targets.Add(monster);
    }
}

最好先建立一個易於閱讀的查詢,並僅更改在實際測量中發現問題的部分。 集合和 LINQ 的關鍵不是擁有最短的語法,而是明確儲存資料的目的以及何時處理它。