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.
此外,以这种方式实现它更容易.想象一下,你必须写一个瞬间Where过IList.哪个必须返回IList.它该怎么办?在原始列表上返回代理?每次访问都会遭受巨大的性能损失.返回包含已过滤商品的新列表?它和做的一样Where().ToList().返回原始列表但删除了所有不匹配的项目?这RemoveAll就是为什么,为什么要制作另一种方法.
请记住,LINQ尝试播放功能,并尝试将对象视为不可变的.
| 归档时间: |
|
| 查看次数: |
2695 次 |
| 最近记录: |