【发布时间】:2012-08-18 01:06:48
【问题描述】:
运行这段代码后:
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() 到 Select() 调用上。
在实际代码中,这比这个简单的插图要复杂得多,在决定是否应该附加 .ToList() 或 .ToArray() 时,有什么好的经验法则?我最初的想法是任何可能被多次迭代的引用表达式,或者为了更安全,以防潜在的迭代不明显,任何结果永远不会改变的引用表达式。
【问题讨论】:
-
你确定
first1 == first2是假的吗?迭代同一个集合应该每次都返回相同的对象。 -
是的,我确定。是同一个表达式,但不是同一个集合。
-
@PeterGluck 这是错误的,因为
U使用标准引用相等。每次迭代都会重新评估序列,因此您会获得新的U实例。 -
是不是每次迭代集合时都创建
new U的问题?还是那个新的U(t) != new U(t)?懒惰是有后果的。这些后果是否可取取决于用例。
标签: c# linq .net-4.5 deferred-execution