为什么 List<A> 在使用 Select 运算符转换时不转换为 List<B>

Why List<A> doesn't convert to List<B> on conversion using Select operator

考虑以下代码,这里我可以将 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 是一个 IEnumerable<B>,其中 aList 的值尚未转换。例如,当您 foreach 遍历该列表或对其调用 .ToList() 时,就会发生这种转换。这就是评论提到的"lazy"方面。

所以你的第二个测试是正确的:它是不是一个List<B>