2008-03-05

linq,对象初始化器,集合初始化器

很久很久以前,写了一篇介绍C#3.0新特性的文章,vs2008发布以后,也一直用,但一直搞不清楚一个地方,就是linq 的select new。对于这样一个类:
public class Car
{
public string Name { get; set; }
public string Brand { get; set; }
public Car(string name, string brand)
{
Name = name;
Brand = brand;
}
}
和其相应的集合
List lc = new List();
lc.Add(new Car("wee","fsfsa"));
lc.Add(new Car("wee","sds"));
lc.Add(new Car("weehd", "fsfsa"));
lc.Add(new Car("weed", "sds"));
查询一般可以这么写:
var cs = from c in lc
where c.Name.EndsWith("d")
select new { c.Name, c.Brand };
这里使用了匿名类型。
但是如果需要把查询单独放在一个方法中的时候,由于方法不能返回匿名类型,所以需要再创建另一个实体类,简单起见,和Car相同,命名为CopyCar
public class CopyCar
{
public string Name { get; set; }
public string Brand { get; set; }
public CopyCar(string name, string brand)
{
Name = name;
Brand = brand;
}
public CopyCar()
{ }
}
另一个方法中的查询
var cs = from c in lc
where c.Name.EndsWith("d")
select new CopyCar{Name= c.Name, Brand= c.Brand};
这里采用了对象初始化器,必须有默认的构造函数。
当然也可以使用构造函数:
var cs = from c in lc
where c.Name.EndsWith("d")
select new CopyCar(c.Name, c.Brand);
return cs;
但这样写是错误的
var cs = from c in lc
where c.Name.EndsWith("d")
select new CopyCar{c.Name, c.Brand};
return cs;
这实际上是集合初始化器的写法,编译会有如下错误
Cannot initialize type 'ConsoleApplication1.CopyCar' with a collection initializer because it does not implement 'System.Collections.IEnumerable'
这么简单的问题,真是后知后觉!

No comments: