C# 從基礎到精通 — 第 6 講
使用集合和 LINQ 運算數據
該部落格上撰寫的文章是出於教學目的而創建的。 另外,文章中的資訊可能不正確,請謹慎。
遊戲和應用程式儲存、搜尋和排序大量資料。 根據目的選擇集合並使用 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 的關鍵不是擁有最短的語法,而是明確儲存資料的目的以及何時處理它。