使用 LINQ 進行數據轉換
語言集成查詢 (LINQ) 不僅可用於檢索數據 而且還是一個功能強大的數據轉換工具 通過使用 LINQ 查詢您可以將源序列用作輸入並采用多種方式修改它以創建新輸出序列 您可以通過排序和分組來修改序列本身而不必修改元素本身但是LINQ 查詢的最強大功能可能在於它能夠創建新類型 這一功能在 select 子句中實現 例如可以執行下列任務
將多個輸入序列合並到具有新類型的單個輸出序列中
創建其元素只包含源序列中的各個元素的一個或幾個屬性的輸出序列
創建其元素包含對源數據執行的操作結果的輸出序列
創建不同格式的輸出序列
將多個輸入聯接到一個輸出序列
可以使用 LINQ 查詢來創建包含多個輸入序列的元素的輸出序列下面的示例演示如何組合兩個內存中的數據結構但組合來自 XML 或 SQL 或數據集源的數據時可應用相同的原則
class Student
{
public string First { get; set; }
public string Last {get; set;}
public int ID { get; set; }
public string Street { get; set; }
public string City { get; set; }
public List<int> Scores;
}
class Teacher
{
public string First { get; set; }
public string Last { get; set; }
public int ID { get; set; }
public string City { get; set; }
}
class DataTransformations
{
static void Main()
{
List<Student> students = new List<Student>()
{
new Student {First=Svetlana
Last=Omelchenko
ID=
Street= Main Street
City=Seattle
Scores= new List<int> { }}
new Student {First=Claire
Last=ODonnell
ID=
Street= Main Street
City=Redmond
Scores= new List<int> { }}
new Student {First=Sven
Last=Mortensen
ID=
Street= Main Street
City=Lake City
Scores= new List<int> { }}
};
List<Teacher> teachers = new List<Teacher>()
{
new Teacher {First=Ann Last=Beebe ID= City = Seattle}
new Teacher {First=Alex Last=Robinson ID= City = Redmond}
new Teacher {First=Michiyo Last=Sato ID= City = Tacoma}
};
var peopleInSeattle = (from student in students
where studentCity == Seattle
select studentLast)
Concat(from teacher in teachers
where teacherCity == Seattle
select teacherLast);
ConsoleWriteLine(The following students and teachers live in Seattle:);
foreach (var person in peopleInSeattle)
{
ConsoleWriteLine(person);
}
ConsoleWriteLine(Press any key to exit);
ConsoleReadKey();
}
}
選擇各個源元素的子集
若要只選擇源元素的一個成員請使用點運算在下面的示例中假定 Customer 對象包含幾個公共屬性其中包括名為 City 的字符串在執行此查詢時此查詢將生成字符串輸出序列
var query = from cust in Customers select custCity;
若要創建包含源元素的多個屬性的元素可以使用具有命名對象或匿名類型的對象初始值設定項
var query = from cust in Customer select new {Name = custName City = custCity};
將內存中的對象轉換為 XML
通過 LINQ 查詢可以輕松地在內存中的數據結構SQL 數據庫ADONET 數據集和 XML 流或文檔之間轉換數據
class XMLTransform
{
static void Main()
{
List<Student> students = new List<Student>()
{
new Student {First=Svetlana Last=Omelchenko ID= Scores = new List<int>{ }}
new Student {First=Claire Last=ODonnell ID= Scores = new List<int>{ }}
new Student {First=Sven Last=Mortensen ID= Scores = new List<int>{ }}
};
var studentsToXML = new XElement(Root
from student in students
let x = StringFormat({}{}{}{} studentScores[]
studentScores[] studentScores[] studentScores[])
select new XElement(student
new XElement(First studentFirst)
new XElement(Last studentLast)
new XElement(Scores x)
)
);
ConsoleWriteLine(studentsToXML);
ConsoleWriteLine(Press any key to exit);
ConsoleReadKey();
}
}
對源元素執行操作
輸出序列可能不包含源序列的任何元素或元素屬性輸出可能是通過將源元素用作輸入參數計算出的值的序列在執行下面這個簡單查詢時此查詢會輸出一個字符串序列該序列值表示根據 double 類型的元素的源序列進行的計算
class FormatQuery
{
static void Main()
{
double[] radii = { };
IEnumerable<string> query =
from rad in radii
select StringFormat(Area = {} (rad * rad) * );
foreach (string s in query)
ConsoleWriteLine(s);
ConsoleWriteLine(Press any key to exit);
ConsoleReadKey();
}
}
From:http://tw.wingwit.com/Article/program/net/201311/12420.html