在linq中的Select()之后的ToList()

时间:2013-12-19 07:10:15

标签: c# linq

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

var names = someStorage.GetItems().Select(x => x.Name).ToList();

3 个答案:

答案 0 :(得分:6)

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

  

ToList(IEnumerable)方法强制立即执行   查询评估并返回包含查询的List   结果。您可以将此方法附加到查询中以获取   缓存的查询结果副本MSDN

答案 1 :(得分:2)

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

另一方面是,如果您不使用ToList(),则每次使用names变量时都会针对数据存储区运行查询 - 而不仅仅是ToList()变量的情况。 {1}}。所以它也在很大程度上取决于你使用names变量的频率(如果你只使用它一次(例如在循环中),那么没有区别,否则ToList()会更有效。

答案 2 :(得分:1)

如果您分配到列表,那么这取决于您的赋值变量,那么您需要转换。

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

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

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

最后两点值得多讨论。首先,没有记录ICollection的优化,但它很有意义:

  • List将其数据存储在内部数组中
  • ICollection公开Count属性,以便List可以创建
  • 开头的正确大小的数组
  • ICollection公开CopyTo方法,以便List可以复制 批量生成的新数组中的所有元素

Source to refer