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

标签 c# .net linq ienumerable

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

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

我抛出一个它无法转换的错误:

Unable to cast object of type 'WhereListIterator`1[AppDataAcces.Customer]' to type 'System.Collections.Generic.List`1[AppDataAcces.Customer]'.

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

最佳答案

does the Enumerable.Where create a new instance of WhereListIterator

是的。

and if so why would anyone do this

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

because thats an unnecessary loss of performance and functionality since i always have to create a new list (.ToList())

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

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

此外,以这种方式实现它要容易得多。想象一下,你必须写 WhereIList .哪个必须返回 IList .它应该做什么?返回原始列表的代理?您将在每次访问时遭受巨大的性能损失。返回包含过滤项目的新列表?这与做 Where().ToList() 是一样的.返回原始列表但删除所有不匹配的项目?这就是RemoveAll是为了,为什么要另做一个方法。

请记住,LINQ 尝试发挥功能性,并尝试将对象视为不可变对象(immutable对象)。

关于c# - 从 List<MyType> 到 IEnumerable<MyType> 返回到 List<MyType> 的转换无效,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11710740/

相关文章:

c# - 在 WPF DataGrid 中实现自定义复制和粘贴,这在其中没有行时有效

c# - 如何使用 LINQ 在 C# 中以 Datetime 格式转换 SQL 中的时间戳数据类型值?

c# - 值来自 C# 到 Javascript 的形式

c# - 查明表达式是否包含 "lonely"ParameterExpression

c# - 域用户的自动完成

c# - 如何在不占用大量内存的情况下显示图像

c# - Linq,选择列表项,其中列是最大值

c# - 与 NULL 比较时的 LINQ 和延迟执行

c# - 检查匿名类型是否等于指定类型

c# - 使用 Windows 窗体进度条时为 "memory leak"