【问题标题】:Is there any performance impact of calling ToList() multiple times? [duplicate]多次调用 ToList() 对性能有影响吗? [复制]
【发布时间】: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&lt;Company&gt;
  • 使用分析器检查是否调用有任何影响。我们不知道,因为我们不知道您的数据来自哪里。是数据库吗?一些服务?一份文件?这对结果是否被缓存有很大影响。但最重要的是:DbContext.Companies 是什么?
  • 这是一样的。一次影响就是多次影响。
  • @akd 调用一次会对性能产生影响 - 多次调用会产生更多的性能影响,不是吗?
  • @akd 是,但重复问题中接受的答案提供了ToList 实现的详细信息,您可以在其中看到即使您在List&lt;T&gt; 上调用ToList - 它仍会将其复制到新的列表。

标签: c# linq


【解决方案1】:

是的,这会影响性能。即使底层IEnumerable&lt;T&gt; 已经是List&lt;T&gt;,对ToList 的调用也会导致创建新列表(所以list != list.ToList())。根据原始列表的大小,这可能会对性能产生严重影响

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-09
    • 2011-11-12
    • 2014-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-04
    相关资源
    最近更新 更多