[C#] Linq進階API用法 & 組合技 (SelectMany, ToLookup, 笛卡兒積...)
C# / LINQ 用「資料形狀」思考 LINQ:SelectMany 與 10 個進階 API Select 、 Where 、 GroupBy 之後的下一步。每個範例都標出資料怎麼進、結果怎麼出—— 綠色註解就是答案 。 SelectMany 三用法 10 個進階 API 組合技 實戰:RulesEngine 形狀對照表 進階 LINQ 有個比背定義更好用的讀法: 看它讓資料的「形狀」怎麼變 。巢狀變扁平、兩條變一條、一條變一個值——記住形狀,API 自然就記住了。這篇每個 API 都附上一行形狀簽名,以及完整的輸入資料與輸出結果。 // SelectMany:進階 LINQ 的入口 它做的事只有一件:把「集合中的集合」攤平成一層。但三種用法各有妙處。 1 / 3 帶 result selector [[a, b], [c]] → [a, b, c] (每個元素還記得自己的爸爸) 最實用的 overload:攤平的同時 保留父層資訊 。第二個參數同時拿得到父元素和子元素。 // 資料 var orders = new[] { new { OrderId = 1, Customer = "小明" , Items = new[] { new { Product = "滑鼠" , Price = 500 }, new { Product = "鍵盤" , Price = 1200 } } }, new { OrderId = 2, Customer = "小華" , Items = new[] { new { Product = "螢幕" , Price = 4500 } } } }; var flat = orders. SelectMany (o => o.Items, (o, item) => new { o.OrderId, o.Customer, item.Product, item.Price }); // 結果:2 筆訂單 × 各自明細 → 攤成 3 列,每列都帶著父層的 Cu...