c# - 何时使用 LINQ 的 .ToList() 或 .ToArray()

标签 c# linq .net-4.5 deferred-execution

运行这段代码后:

var input = new List<T>( ... );
var result = input.Select( t => new U(t) );

U first1 = null;
foreach ( U u1 in result )
    if ( first1 == null )
        first1 = u1;

U first2 = null;
foreach ( U u2 in result )
    if ( first2 == null )
        first2 = u2;

然后 'first1 == first2' 评估为 false,即使两个 U 包装相同的 T。我还没有测试它,但我认为它可以通过链接 .ToList() 或 .ToList() 来评估为 true。 ToArray() 到 Select() 调用上。

在实际代码中,比这个简单的例子要复杂得多,在决定是否应该附加 .ToList() 或 .ToArray() 时,什么是好的经验法则?我最初的想法是任何可能被迭代多次的引用表达式,或者为了在潜在迭代不明显的情况下更安全,任何其结果永远不会改变的引用表达式。

最佳答案

不幸的是,我不认为这里有一个好的“硬性规定”。这在很大程度上取决于您期望如何使用结果,以及查询本身实际上在做什么。

My initial thoughts are either any expression that may be iterated more than once or, to be safer in case potential iterations are not obvious, any expression whose result will never change.

一般来说,如果您要多次使用一个查询的结果,最好通过ToList() 存储它。或 ToArray() .如果您的 LINQ 查询是“昂贵的”查询,则尤其如此,因为它可以防止昂贵的操作运行多次。

通常,如果您只想枚举结果,那么我会将其保留为 IEnumerable<T> .如果您打算存储结果,或多次使用结果,那么将其存储在集合中可能会有所帮助。

另一个需要注意的地方是您是否在公共(public) API 中返回结果。虽然很高兴返回 IEnumerable<T> ,根据预期的用例,您可能需要考虑使用 ToList()以防止操作被多次执行。

至于是否使用ToList()ToArray() ,这实际上取决于您将如何使用结果。与每个相关的成本几乎相同(如果输入不是 ToList()ICollection<T> 实际上执行开销略低)。通常,我更喜欢 ToList()ToArray()除非我对数组有特定的需求或愿望。

关于c# - 何时使用 LINQ 的 .ToList() 或 .ToArray(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12014969/

相关文章:

c# - linq - 选择不等于某物的元素

c# - 使用LINQ根据Where过滤List中的某个值

mysql - EF5不使用MySQL生成枚举字段

c# - 从数据库表中查找数据

c# - AutoMapper:将接口(interface)映射到抽象类——这可能吗?

performance - Linq 解谜器

wpf - 不在焦点时覆盖 ListBoxItem 背景颜色 (.NET 4.5)

asynchronous - 任务.继续困惑

C# 检查按键是否有延迟(控制台应用程序)

c# - LINQ to SQL 的编译查询什么时候提高性能