【发布时间】:2018-04-03 20:29:54
【问题描述】:
我开始从事一个项目,我注意到 ToList() 被多次调用,我认为它并不是真正必要和多余的。
第一个 ToList() 位于数据层,调用进入数据库并获取数据。
public IEnumerable<Company> GetCompanies()
{
return DbContext.Companies.ToList();
}
然后在控制器上我可以看到另一个调用 ToList()
public ActionResult Index()
{
var companies = _companyService.GetCompanies().ToList();
return View(companies);
}
我相信在控制器中调用 ToList() 是多余的。但我只是想知道它是否对性能有任何影响,或者语言本身会自动识别结果实际上已经是列表并忽略第二次调用?
更新
另一个问题是调用 ToList() 是否有影响。但是,我想知道对于同一个对象列表多次调用 ToList() 是否会产生影响。正如有人提到的那样,这应该被“希望忽略”。
【问题讨论】:
-
这是糟糕的设计。您的方法应在签名中返回尽可能具体的类型。方法参数应尽可能通用。在上述情况下,
GetCompanies的签名应更改为返回List<Company> -
使用分析器检查是否调用有任何影响。我们不知道,因为我们不知道您的数据来自哪里。是数据库吗?一些服务?一份文件?这对结果是否被缓存有很大影响。但最重要的是:
DbContext.Companies是什么? -
这是一样的。一次影响就是多次影响。
-
@akd 调用一次会对性能产生影响 - 多次调用会产生更多的性能影响,不是吗?
-
@akd 是,但重复问题中接受的答案提供了
ToList实现的详细信息,您可以在其中看到即使您在List<T>上调用ToList- 它仍会将其复制到新的列表。