透過 select 子句建立新型別,可將來源序列轉換為任意形狀的輸出序列:合併多源、擷取子集、計算衍生值、轉換格式(如 SQL 行 → XML)。查詢結果可串接作為下一個查詢的輸入,形成管線。
class Student { public string First, Last, City; public int ID; public List<int> Scores; }
class Teacher { public string First, Last, City; public int ID; }
var peopleInSeattle = (from s in students where s.City == "Seattle" select s.Last)
.Concat(from t in teachers where t.City == "Seattle" select t.Last);
// 輸出: Omelchenko, Beebe
var cities = from c in Customers select c.City; // IEnumerable<string>
var summary = from c in Customers
select new { Name = c.Name, City = c.City }; // IEnumerable<匿名型別>
var studentsToXML = new XElement("Root",
from s in students
let scores = string.Join(",", s.Scores)
select new XElement("student",
new XElement("First", s.First),
new XElement("Last", s.Last),
new XElement("Scores", scores)
)
);
// 輸出完整 XML 文件
輸出範例:
<Root>
<student><First>Svetlana</First><Last>Omelchenko</Last><Scores>97,92,81,60</Scores></student>
<student><First>Claire</First><Last>O'Donnell</Last><Scores>75,84,91,39</Scores></student>
<student><First>Sven</First><Last>Mortensen</Last><Scores>88,94,65,91</Scores></student>
</Root>
double[] radii = { 1, 2, 3 };
IEnumerable<string> areas = from r in radii
select string.Format("Area = {0}", r * r * 3.14);
// 輸出: Area = 3.14, Area = 12.56, Area = 28.26
// 先轉 XML,再查詢 XML
var highScores = from x in studentsToXML.Elements("student")
where (int)x.Element("Scores").Value.Split(',').Max() > 90
select x.Element("Last").Value;
LINQ 的轉換能力在於 select 子句的靈活性:
Concat、Union、Join、GroupJoin。善用「查詢即資料、資料即查詢」的組合性,能以宣告式風格替代大量命令式迴圈與中間集合。