你能否回归IList <t>?</t>

时间:2010-03-05 19:04:42

标签: .net c#-3.0 yield-return

在我的MVC应用程序的服务层中,我试图将linq转换为sql实体结果到我的业务模型实体中。我目前正在尝试以下代码:

    public IList<Project> GetAllProjects()
    {
        var results = from p in _context.Repository<DBMappings.project>()
                      select p;

        foreach (DBMappings.project prj in results.ToList<DBMappings.project>())
            yield return CreateProjectEntityFromDBProject(prj);

    }

不幸的是,这似乎不起作用,我唯一可以猜到的是,yield只适用于IEnumerable。除了创建新列表,在foreach循环中添加项目并返回列表之外,还有其他解决方案吗?我需要使用IList,因为使用返回列表的方法需要能够执行列表方法,例如.Sort()。

4 个答案:

答案 0 :(得分:7)

如果你想.Sort(),你一定要在你的方法中创建一个列表。使用yield可以节省一些内存 - 因为结果不会存储为单个对象。当您只想查看结果时,这非常有用。但是如果你想对内存中的东西进行排序,你需要将它作为一个整体存储在内存中。

答案 1 :(得分:2)

C#规范的第8.14节(强调我的):

  

yield语句用于   迭代器块(第8.2节)产生一个值   到枚举器对象(§10.14.4)或   可枚举对象(第10.14.5节)   迭代器或发出信号的结束   迭代。

IList实现IEnumerable,但它没有实现IEnumerator。

答案 2 :(得分:2)

你不能“懒惰地返回”一个列表,但看起来你可以得到你想要的东西:

return results.Select(prj=>CreateProjectEntityFromDBProject(prj)).ToList();

或只是

var results = from p in _context.Repository<DBMappings.project>()
                  select CreateProjectEntityFromDBProject(p);
return results.ToList();

答案 3 :(得分:1)

IList<T>描述了与IEnumerable<T>不兼容的功能,至少就延迟加载而言。

能够转到特定索引la IList<T>,要求整个枚举“枚举”,至少达到指定的索引。

如果您不关心整个IEnumerable<T>的评估,那么您可以构造List<T>IEnumerable<T>作为构造函数参数,然后返回{{1作为List<T>