考虑以下一段代码,这里我可以将IEnumerable<A>
类型转换为List<A>
,因为这是它内部包含的内容,但是当我使用 Select
将同一集合转换为 IEnumerable<B>
时,它不是List<B>
,我只能通过调用 ToList()
来实现,这是我实际代码中的惩罚, 由于第一个集合中有数百万条记录。有没有更好的方法来实现它,我想知道为什么List<A>
不会转换为List<B>
,如果List是底层内存分配
void Main()
{
A a = new A { Id = 1 };
IEnumerable<A> aList = new List<A> {a};
((aList as List<A>) != null); // True
var bList = aList.Select(x => new B { Id = x.Id});
((bList as List<B>) != null); // False
}
public class A
{
public int Id { get; set;}
}
public class B
{
public int Id { get; set; }
}
您的bList
是一个尚未转换aList
值的IEnumerable<B>
。例如,当您foreach
该列表或在其上调用.ToList()
时,将发生这种转换。这是评论提到的"懒惰"方面。
所以你的第二个测试是对的:它不是List<B>
.