我注意到当使用具有匿名函数或在运行时计算的其他值的Select时,每次访问输出IEnumerable对象时,投影都会重新计算该值。例如:
public class A
{
public string Name { get; set; }
public string Addr { get; set; }
}
public class B
{
public A Whatever {get;set;}
public int Id {get;set;}
}
Random rand = new Random();
IEnumerable<B> listOfBs = someListOfA.Select( x => new B()
{
Id = rand.Next(),
Whatever = x
});
我注意到每次遍历listOfB并使用Id属性时,Id都会重新计算出一个随机数rand.Next()
。
foreach( B b in listOfBs )
{
doSomething( b.Id );
}
在C#的文档中,我没有看到有什么东西会导致这种情况。几乎可以说Select生成了一个匿名函数,每次访问时都会重新评估。所以,两个问题:
- 我看到的这种行为是什么。
- 如何避免这种行为,但仍然能够将一个类型的列表转换为另一个类型的列表。
如果我的糟糕示例代码传达了我的意思,请告诉我。
listOfBs
时,它每次都有不同的随机值吗? - Chetan