如何列出到列表转换

问题描述:

我想转换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 
} 

有什么想法?

使用Enumerable.Cast

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>(); 
} 
+1

+1对于很好的解释(并根据最后的评论进行调整...) – 2010-01-05 01:25:32

+0

是的,谢谢你指出,这使我给他的代码比我最初做的更仔细的检查。 – jason 2010-01-05 01:46:57

+0

伟大的审查。也许是因为我被困在2.0的土地上,但是不需要“回报”? – 2010-01-05 01:52:37

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,这允许您更隐含地执行此操作。

+0

+1提到协变性(并惊讶于这是唯一的答案) – 2010-01-05 05:57:14