public class Person
{
public int Age { get; set; }
public string Name { get; set; }
List<Person> friends = new List<Person>();
public List<Person> Friends
{
get { return friends; }
}
Location home = new Location();
public Location Home
{
get { return home; }
}
public Person() //List<Person> 和 Location 类
{
}
public Person(string name)
{
Name = name;
}
}
class Projection
{
static void Main() //从Person对象转换成一个名字和一个是否成年标志 c#3
{
List<Person> family = new List<Person>
{
new Person { Name="Holly", Age=37 }, //初始化5次
new Person { Name="Jon", Age=36 },
new Person { Name="Tom", Age=9 },
new Person { Name="Robin", Age=6 },
new Person { Name="William", Age=6 }
};
var converted = family.ConvertAll(delegate(Person person)
{ return new { person.Name, IsAdult = (person.Age >= 18) }; } //返回Name, True,False
);
foreach (var person in converted)
{
Console.WriteLine("{0} is an adult? {1}",
person.Name, person.IsAdult);
}
}
}在真正的代码中,你经常都需要从现有的对象复制属性。你有时需要以某种方式处理值,但通常一次复制就够了。
将Person类的一个集合转换成一个相似的集合。在新集合中,每个元素只有一个name,另外一个标志值指出这个人是不是成年人
new {Name = person.Name, IsAdult = {person.Age >= 18}}
对单一属性来说,设置名字的语法,并不太笨拙。但是,如果要复制几个属性,代码就有点烦人了
c#3支持一种简化的语法,如果不指定属性名称,而是只指定求值的表达式,它就会使用表达式的最后一个部分作为名称
前提是它只能是一个简单字段或属性。 这就是所谓的投影初始化程序,
new { person.Name, IsAdult = (person.Age >= 18) }
一个匿名对象初始化程序中的每一个部分都是投影过来的。例如,一些属性从一个对象中获取,另一些属性从另一个对象中获取。
这通常是一次连接操作的一部分
输出
Holly is an adult? True
Jon is an adult? True
Tom is an adult? False
Robin is an adult? False
William is an adult? False
本文介绍如何使用C#3.0的简化语法进行对象属性的复制与处理,通过实例演示了如何从Person对象集合转换为包含姓名及是否成年的简化对象集合。

22万+

被折叠的 条评论
为什么被折叠?



