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()或.ToArray()来评估为true.进入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>.如果您打算存储结果,或者多次使用结果,则将其存储在一个集合中是有益的.
另一个要注意的地方是将结果返回公共API.虽然返回IEnumerable< T>通常很好,但是根据预期的使用情况,您可能需要考虑使用ToList()来防止多次执行操作.
至于是否使用ToList()或ToArray(),它真的取决于如何使用结果.与每个相关联的成本几乎相同(如果输入不是ICollection< T>),ToList()实际上具有略低的执行开销.通常,我喜欢ToArray()To ToArray(),除非我有一个特定的需要或渴望一个数组.