【发布时间】:2012-07-27 11:39:42
【问题描述】:
所以基本上我有这个方法。
public List<Customer> FilterCustomersByStatus(List<Customer> source, string status)
{
return (List<Customer>)source.Where(c => c.Status == status);
}
我向我抛出了一个无法转换的错误:
无法将“WhereListIterator`1[AppDataAcces.Customer]”类型的对象转换为“System.Collections.Generic.List`1[AppDataAcces.Customer]”类型。
为什么...?由于基础类型相同,Enumerable.Where 是否会创建 WhereListIterator 的新实例,如果是,为什么会有人这样做,因为这是不必要的性能和功能损失,因为我总是必须创建一个新列表 (.ToList( ))
【问题讨论】:
-
使用 Linq,它会创建一个可枚举/枚举器,并动态地遍历您的集合而不创建新集合。除非您调用
.ToList(),否则它实际上不会返回List对象。这样做的原因是为了提高性能和限制内存使用;给定一个包含 1000000 个条目的列表,Linq 可以过滤/选择所有项目,而无需每次都复制列表。 -
您能解释一下为什么每次都需要
List吗?特别是如果它包含 500k 条目,如您所说。 -
我喜欢将它们保存在一个列表中,以便我可以添加/修改它的一些元素,即使我在显示项目时将它们保存在一个 IEnumerable 中,我仍然需要一些东西来按顺序枚举我的对象为了得到它们,尽管我在寻找这种方法的实现相关性而不是我的工作相关性。
-
向filtered列表添加或修改项目有什么意义?您能否向我们展示您的代码中更大的部分,并描述您要解决的场景?
-
我不是在尝试解决任何特殊情况,只是想了解它为什么以这种方式实现(有什么好处)?这就是我在这里问的原因,仅此而已。
标签: c# .net linq ienumerable