为什么 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>
。
考虑以下代码,这里我可以将 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>
。