我想知道以下事实。我有一个数据存储库,它返回我的所有数据 IEnumerable<Customer>
.
在我的业务逻辑中,有时我需要列表,以便我可以添加内容,例如。
当我检索 IEnumerable<Customer>
时我有 2 个选项可以从中获取列表。
要么使用Linq扩展方法.ToList()
或像这样转换它(我认为它不是转换)(List<Customer>)IEnumerable<Customer>
.
必须提及的是,我不使用列表进行迭代,因此我不需要每次枚举的新副本。在这种情况下,在我的简单情况下,我必须使用 cast 方法而不是 .ToList
是真的吗? (创建一个新副本)?
// use simple cast?
List<Customer> customers = (List<Customers>)DataSource.GetCustomers();
// or if i use this i get a bit of performance loss?
List<Customer> customers = DataSource.GetCustomers().ToList();
最佳答案
我会选择 ToList()
,因为该方法返回一个 IEnumerable<Customer>
并且您无法确定内部实现。
也许现在 GetCustomers()
返回 List<>
被 IEnumerable<>
掩盖,但是如果将来内部实现发生变化怎么办?
编辑:
List<Customer>
实现接口(interface) IEnumerable<Customer>
,以及类似 Customer[]
的数组或 LinkedList<Customer>
.因此,当您收到类型为 IEnumerable<WhateverClass>
的对象时你不能确定它是 List<Customer>
当然,只有当您要转换为的类型与接口(interface)后面的类型相同时,转换才会起作用,否则您将收到异常。
使用 ToList()
,正如您所说的那样,您创建了一个包含 IEnumerable<>
元素的新对象,但至少您可以毫无异常(exception)地安全地迭代/修改该对象。
方法返回 IEnumerable<T>
因为这样它就不会绑定(bind)到任何特定的集合实现,并且在未来它可以在不改变方法签名的情况下从列表切换到数组或其他任何东西......
关于c# - 哪种 IEnumerable To a List 方式更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11700935/