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 obv@R_301_437@s,any expression whose result will never change.
一般来说,如果要多次使用查询结果,通过ToList()或ToArray()存储它总是一个好主意.如果你的LINQ查询是一个“昂贵的”查询是特别的,因为它可以防止昂贵的操作运行不止一次.
通常情况下,如果您仅仅列举结果,那么我将其保留为IEnumerable< T>.如果您打算存储结果,或者多次使用结果,则将其存储在一个集合中是有益的.
另一个要注意的地方是将结果返回公共API.虽然返回IEnumerable< T>通常很好,但是根据预期的使用情况,您可能需要考虑使用ToList()来防止多次执行操作.
至于是否使用ToList()或ToArray(),它真的取决于如何使用结果.与每个相关联的成本几乎相同(如果输入不是ICollection< T>),ToList()实际上具有略低的执行开销.通常,我喜欢ToArray()To ToArray(),除非我有一个特定的需要或渴望一个数组.