如何列出到列表转换
我想转换List<Company>
到List<ICompany>
如何列出<Company>到列表转换<ICompany>
ICompany
是一个接口,它Company
工具。
public List<ICompany> FindAll()
{
List<Company> companies = new List<Company>();
var query = from c in _scope.Extent<Company>()
select c;
companies = query.ToList();
return companies.ToList<ICompany>(); // doesn't work
//and
return companies.ToList(); // doesn't work
}
有什么想法?
return query.Cast<ICompany>().ToList();
几点意见:
List<Company> companies = new List<Company>();
这将创建一个新的列表。但是你从来没有使用它,因为两行以后你
companies = query.ToList();
覆盖您所创建的列表(和在中间线你永远参考companies
)。如果你愿意,你可以声明并获得一举结果:
List<Company> companies = query.ToList();
其次,这一切都是不必要的,如果你只是想返回结果的列表。简洁(在某种程度上)是编程方面的一大优势。 “越少越好”的意思是,越少的代码意味着写入的代码越少,测试代码越少,维护代码越少。通过编写更少的代码提高生产力!这是你的方法的短版:
public List<ICompany> FindAll() {
var query = from c in _scope.Extent<Company>()
select c;
return query.Cast<ICompany>().ToList();
}
甚至
public List<ICompany> FindAll() {
return _scope.Extent<Company>().Cast<ICompany>().ToList();
}
第三,至少,你应该考虑回国的IList
代替List
。编码到接口而不是具体类型更好。这将您的代码从实现细节中分离出来,使代码更易于更改并更易于测试。
最后,你应该检查你是否真的需要返回List
。你使用的是什么方法?如果你只是用它来枚举结果(foreach(var item in list)
),那么你应该将返回一个IEnumerable<ICompany>
:
public IEnumerable<ICompany> FindAll() {
return _scope.Extent<Company>().Cast<ICompany>();
}
return companies.Cast<ICompany>().ToList();
如果由于某种原因,你不想使用Enumerable.Cast
(虽然我会建议这样做与其他意见一起)你总是可以做到这一点:
companies = query.ToList();
List<ICompany> ret = new List<ICompany>();
foreach (Company c in companies)
{
ret.Add(c as ICompany);
}
这几乎是相同的解决方案Skeolan的,但如果(ICompany)c
failes它抛出。在我的代码中,如果转换失败,c as ICompany
将返回null。
除了Enumerable.Cast答案,如果你发现自己公司和ICompany的集合之间往来很多,另一个建议可能是自Collection <牛逼>派生自己的集合类称为CompanyCollection并使其实现IList <ICompany>。
如果您使用的是.NET 4。0(目前处于测试阶段),您可以利用generic covariance,这允许您更隐含地执行此操作。
+1提到协变性(并惊讶于这是唯一的答案) – 2010-01-05 05:57:14
+1对于很好的解释(并根据最后的评论进行调整...) – 2010-01-05 01:25:32
是的,谢谢你指出,这使我给他的代码比我最初做的更仔细的检查。 – jason 2010-01-05 01:46:57
伟大的审查。也许是因为我被困在2.0的土地上,但是不需要“回报”? – 2010-01-05 01:52:37