从List <MyType>到IEnumerable <MyType>返回List <MyType>的转换无效,为什么?

Fre*_*man 5 .net c# linq ienumerable

所以基本上我有这个方法.

public List<Customer> FilterCustomersByStatus(List<Customer> source, string status)
{
    return (List<Customer>)source.Where(c => c.Status == status);
}
Run Code Online (Sandbox Code Playgroud)

我抛出一个它无法投射的错误:

无法将类型为'WhereListIterator`1 [AppDataAcces.Customer]'的对象转换为'System.Collections.Generic.List`1 [AppDataAcces.Customer]'.

为什么...?由于底层类型是相同的,Enumerable.Where是否创建了WhereListIterator的新实例,如果是这样,为什么有人会这样做,因为这是不必要的性能和功能损失,因为我总是要创建一个新列表(.ToList( ))

Ser*_*sev 10

是Enumerable.Where创建一个新的实例 WhereListIterator

是.

如果是这样,为什么有人会这样做

因为它允许懒惰的流式传输行为.Where如果消费者只想要第一个或第二个条目,则不必过滤所有列表.这对LINQ来说是正常的.

因为这总是不得不创建一个新的列表(.ToList()),这是不必要的性能和功能损失

"性能和功能的损失"来自您的设计.List<Customer>过滤后不需要,因为对它进行任何修改都是没有意义的.

更新:"为什么这样实现" 因为它实现了IEnumerable,而不是IList.因此它看起来像IEnumerable嘎嘎叫IEnumerable.

此外,以这种方式实现它更容易.想象一下,你必须写一个瞬间WhereIList.哪个必须返回IList.它该怎么办?在原始列表上返回代理?每次访问都会遭受巨大的性能损失.返回包含已过滤商品的新列表?它和做的一样Where().ToList().返回原始列表但删除了所有不匹配的项目?这RemoveAll就是为什么,为什么要制作另一种方法.

请记住,LINQ尝试播放功能,并尝试将对象视为不可变的.