哪个IEnumerable To List方式更好?

Fre*_*man 2 .net c# linq collections ienumerable

我想知道以下事实.我有一个数据存储库,可以返回我的所有数据IEnumerable<Customer>.

在我的业务逻辑中,有时候我需要列表,所以我可以添加一些东西.

当我检索IEnumerable<Customer>我有2个选项来从中获取列表.

要么使用Linq扩展方法,要么使用Lint扩展方法.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(); 
Run Code Online (Sandbox Code Playgroud)

dig*_*All 5

我会去ToList(),因为该方法返回一个IEnumerable<Customer>,你不能确定内部实现.

也许现在GetCustomers()返回一个List<>被a 掩盖IEnumerable<>,但是如果将来内部实现发生变化会怎么样?

编辑:

List<Customer>实现接口IEnumerable<Customer>,以及像Customer[]或一个数组LinkedList<Customer>.因此,当您收到类型的对象时,IEnumerable<WhateverClass>您无法确定它是否为a List<Customer>,当然,仅当您要转换为的类型在接口后面时,转换才有效,否则您将收到异常.

使用ToList(),为你正确地说,你创建一个包含的元素的新对象IEnumerable<>,但至少你可以放心地迭代/修改对象没有任何异常.

这些方法返回IEnumerable<T>是因为它以这种方式没有绑定到任何特定的集合实现,并且将来它可以在不更改方法签名的情况下从列表切换到数组或其他任何内容...