首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >()之后的ToList()

()之后的ToList()
EN

Stack Overflow用户
提问于 2013-12-19 15:10:15
回答 3查看 9.2K关注 0票数 4

在下面的代码中,在Select()之后是否需要使用ToList():

代码语言:javascript
复制
var names = someStorage.GetItems().Select(x => x.Name).ToList();
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-12-19 15:12:06

Enumerable.ToList方法会导致数据填充,如果你不调用,数据将不会被获取,它将是一个查询。

ToList(IEnumerable)方法强制立即计算查询,并返回包含查询结果的列表。您可以将此方法附加到查询中,以获得查询结果的缓存副本MSDN.

票数 6
EN

Stack Overflow用户

发布于 2013-12-19 15:21:16

这完全取决于您的代码随后会做什么。ToList()方法使您使用Select()定义的查询立即针对数据存储区运行。如果没有它,它的执行将延迟到您第一次访问names变量。

另一个方面是,如果不使用ToList(),那么每次使用names变量时都会对数据存储运行查询,而不是像ToList()那样只运行一次。因此,这也在很大程度上取决于您使用names变量的频率(如果您只使用一次(例如,在循环中),则没有区别,否则ToList()会更有效。

票数 5
EN

Stack Overflow用户

发布于 2013-12-19 15:12:58

这取决于你的赋值变量,如果你赋值给list,那么你需要进行转换。

如果不调用ToList,它将是一个作为枚举数的IEnumerable<TSource>,它支持对指定类型的集合进行简单迭代。

ToList将源序列转换为列表。需要注意的几点:

  • 签名指定的是List,而不仅仅是IList。当然,它可以返回List的子类,但似乎没有什么意义。它使用立即执行-这里没有任何延迟,参数(
  • )不能为
  • 它针对源代码实现时的情况进行了优化始终创建一个新的、独立的列表。

最后两点值得进一步讨论。首先,针对ICollection的优化没有文档记录,但它很有意义:

  • List在内部将其数据存储在数组中
  • ICollection公开了一个Count属性,以便该列表可以创建一个大小恰到好处的数组,开始时
  • ICollection公开了一个CopyTo方法,以便该列表可以将所有元素复制到bulk

中新创建的数组中

Source to refer

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20675469

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档