C# 如何转换列表<;公司>;列出<;i公司>;

C# 如何转换列表<;公司>;列出<;i公司>;,c#,.net,linq,generics,collections,C#,.net,Linq,Generics,Collections,我想将列表转换为列表 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(

我想将
列表
转换为
列表

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
}
公共列表FindAll()
{
上市公司=新上市公司();
var query=来自_scope.Extent()中的c
选择c;
companys=query.ToList();
return companys.ToList();//不起作用
//及
return companys.ToList();//不起作用
}
有什么想法吗?

使用:

覆盖您创建的列表(在中间行中,您永远不会提及
公司
)。如果您愿意,您可以一次申报并获得结果:

List<Company> companies = query.ToList();
返回公司.Cast().ToList();

如果出于某种原因,您不想使用
Enumerable.Cast
(尽管我建议您与其他注释一起使用),您始终可以这样做:

companies = query.ToList();
List<ICompany> ret = new List<ICompany>();
foreach (Company c in companies) 
{
   ret.Add(c as ICompany);
}
companys=query.ToList();
List ret=新列表();
foreach(公司中的公司c)
{
补充说明(c为I公司);
}

这与Skeolan的解决方案几乎相同,但如果
(ICompany)c
失败,它就会抛出。在我的代码中,如果强制转换失败,
c as ICompany
将返回null。

除了可枚举的.cast答案之外,如果您发现自己经常在Company和ICompany集合之间穿梭,另一个建议可能是从名为CompanyCollection的集合派生您自己的集合类,并让它实现IList


如果您使用的是.NET 4.0(目前处于beta版),您可以利用它来更隐晦地执行此操作。

+1提供了很好的解释(并根据上一条评论进行了调整…)是的,感谢您指出这一点,这使我比最初更仔细地检查了他的代码。很棒的评论。也许是因为我被困在2.0的土地上,但不需要“回报”吗?+1用于提及协方差(并且惊讶于这是唯一的答案)
companies = query.ToList();
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();
}
public IEnumerable<ICompany> FindAll() {
    return _scope.Extent<Company>().Cast<ICompany>();
}
return companies.Cast<ICompany>().ToList(); 
companies = query.ToList();
List<ICompany> ret = new List<ICompany>();
foreach (Company c in companies) 
{
   ret.Add(c as ICompany);
}