這張圖很好的解釋了 LINQ 常用的方法會產生的結果:

int? a = (new List<int>{2}).Select(x => x).FirstOrDefault(); // 2 int? b = (new List<int>{}).Select(x => x).FirstOrDefault(); // 0 int? c = (new List<int>{2}).Select(x => (int?)x).FirstOrDefault(); // 2 int? d = (new List<int>{}).Select(x => (int?)x).FirstOrDefault(); // null
<?xml version="1.0" encoding="utf-8"?> <menu_config> <menu title="文章管理" url="~/Article" target="" allow=""> <submenu title="列表" url="~/Article/list" allow="" /> <submenu /> <submenu title="新增" url="~/Article/add" allow="" /> </menu> <menu /> <menu title="帳號管理" url="~/Admin" /> </menu_config>
//using System.Collections.Generic; //using System.IO; //using System.Linq; //using System.Xml.Linq; //using System.Text; public class MenuDataModel { /*POCO 資料欄位*/ public string Title { get; set; } public string Url { get; set; } public string Target { get; set; } public string Allow { get; set; } public string Icon { get; set; } public List<MenuDataModel> Submenu { get; set; } /*取得資料清單*/ public static List<MenuDataModel> GetList(string menuConfigPath) { /*讀取 XML 檔案*/ var xmlContent = File.ReadAllText(menuConfigPath, Encoding.UTF8); var menuDocument = XDocument.Parse(xmlContent); /*利用 LINQ 轉成 POCO*/ return menuDocument.Root.Elements("menu") .Select(menu => new MenuDataModel { /*取得 Element 上的 Attribute*/ Title = (string) menu.Attribute("title"), Url = (string) menu.Attribute("url"), Target = (string) menu.Attribute("target"), Icon = (string) menu.Attribute("icon") ?? "Item", Allow = (string) menu.Attribute("allow"), /*取得子層級 Element 上的 Attribute*/ Submenu = menu.Elements("submenu") .Select(sub => new MenuDataModel { Title = (string) sub.Attribute("title"), Url = (string) sub.Attribute("url"), Target = (string) sub.Attribute("target"), Icon = (string) sub.Attribute("icon") ?? "Item", Allow = (string) sub.Attribute("allow"), }).ToList(), }).ToList(); } } void Main() { var path = @"D:\menu_config.xml"; List<MenuDataModel> list = MenuDataModel.GetList(path); list.Dump(); }