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

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

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

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

對象初始化表達(dá)式(object initialization expressions)是語言級集成查詢(language integrated query)的一個重要特性,因?yàn)樗试S新的結(jié)構(gòu)型值(structured values)的構(gòu)造(construction)存在于只允許表達(dá)式(expressions)(就像 lambda 表達(dá)式和表達(dá)式樹)的上下文里(in contexts)。考察下面這段查詢表達(dá)式代碼,它為輸入序列(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)初始化結(jié)構(gòu)型值的數(shù)組(arrays of structured values)。例于,下面的數(shù)組變量(array variable)是用單獨(dú)的(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