代码之家  ›  专栏  ›  技术社区  ›  Robs Nealvs

如何将list<company>转换为list<icompany>

  •  4
  • Robs Nealvs  · 技术社区  · 15 年前

    我想换衣服 List<Company> List<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
    }
    

    有什么想法吗?

    4 回复  |  直到 15 年前
        1
  •  25
  •   Ahmad Mageed    15 年前

    使用 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 . 最好是编码到接口,而不是具体的类型。这将使代码与实现细节分离,使代码更易于更改和测试。

    最后,您应该检查是否确实需要返回 . 你在使用列表上的哪些方法?如果你只是用它来列举结果( foreach(var item in list) )那么你应该返回一个 IEnumerable<ICompany> :

    public IEnumerable<ICompany> FindAll() {
        return _scope.Extent<Company>().Cast<ICompany>();
    }
    
        2
  •  3
  •   spender    15 年前
    return companies.Cast<ICompany>().ToList(); 
    
        3
  •  1
  •   Josh    15 年前

    除了可枚举的.cast答案外,如果您发现自己经常在公司集合和iCompany集合之间徘徊,另一个建议可能是从名为CompanyCollection的集合<t>派生您自己的集合类,并让它实现iList<iCompany>。

    如果您使用的是.NET 4.0(目前是beta版),那么您可以利用 generic covariance 这使您可以更含蓄地执行此操作。

        4
  •  0
  •   Ari Roth    15 年前

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

    companies = query.ToList();
    List<ICompany> ret = new List<ICompany>();
    foreach (Company c in companies) 
    {
       ret.Add(c as ICompany);
    }
    

    这和斯科兰的解决方案差不多,但是如果 (ICompany)c 失败就是失败。在我的代码中, c as ICompany 如果强制转换失败,将返回空值。