3.4 初始化混合的值(Initializing Compound Values)
Lambda 表達式和擴展方法提供我們查詢所需要的任何東西,只需簡單將成員(members)過濾出數(shù)據(jù)序列(filter members out of sequence of values)。大多數(shù)查詢表達式還能在那些成員上執(zhí)行發(fā)送功能(perform projection),可以有效地將原始序列的成員(members of the original sequence)轉換成(transforming)它們的值(value)和類型(type)可能與原來不同的成員。為了支持編寫這種轉換操作,LINQ 依賴(rely on)一種新的構造(construct)方法叫做“對象初始化表達式(object initialization expressions)”來創(chuàng)建新的結構型類型的實體(instances of structured types)。在本文余下的部分(the rest of),我們假設(assume)已經(jīng)定義了下面的類型:

public class Person
{
string name;
int age;
bool canCode;


public string Name
{

get
{ return name; } set
{ name = value; }
}


public int Age
{

get
{ return age; } set
{ age = value; }
}


public bool CanCode
{

get
{ return canCode; } set
{ canCode = value; }
}
}

對象初始化表達式(object initialization expressions)允許我們簡單地構造(construct)一個類型(type)的基于公共域和屬性(public fields and properties)的值(values)。舉例來說,要創(chuàng)建類型 Person 的一個新的值,語句可以這樣寫:

Person value = new Person
{
Name = "Chris Smith", Age = 31, CanCode = false
};

從語義(Semantically)上說,它等價于(equivalent to)下面這段語句序列(sequence of statements):
Person value = new Person();
value.Name = "Chris Smith";
value.Age = 31;
value.CanCode = false;

對象初始化表達式(object initialization expressions)是語言級集成查詢(language integrated query)的一個重要特性,因為它允許新的結構型值(structured values)的構造(construction)存在于只允許表達式(expressions)(就像 lambda 表達式和表達式樹)的上下文里(in contexts)。考察下面這段查詢表達式代碼,它為輸入序列(input sequence)的每個值都創(chuàng)建一個 Person 對象值:

IEnumerable<Person> expr = names.Select(s => new Person
{
Name = s, Age = 21, CanCode = s.Length == 5
});

對象初始化語法(object initialization syntax)也是為了便于(convenient for)初始化結構型值的數(shù)組(arrays of structured values)。例于,下面的數(shù)組變量(array variable)是用單獨的(individual)對象初始化(object initializers)初始化的:

static Person[] people =
{

new Person
{ Name="Allen Frances", Age=11, CanCode=false },

new Person
{ Name="Burke Madison", Age=50, CanCode=true },

new Person
{ Name="Connor Morgan", Age=59, CanCode=false },

new Person
{ Name="David Charles", Age=33, CanCode=true },

new Person
{ Name="Everett Frank", Age=16, CanCode=true },
};

待續(xù), 錯誤難免,請批評指正,譯者Naven 2005-10-23