为什么"列表"<A>在使用"<B>选择"运算符进行转换时未转换为"列表"



考虑以下一段代码,这里我可以将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>.

最新更新