gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 22:23:31 29 4
gpt4 key购买 nike

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

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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com