Ben*_*Ben 38 c# collections ienumerable
我希望从方法中返回一个有序的项目列表.我的返回类型应该是IEnumerable还是IList?
Hen*_*man 42
这里有一个层次结构:
interface IList<T> : ICollection<T> { }
interface ICollection<T> : IEnumerable<T> { }
Run Code Online (Sandbox Code Playgroud)
你想瞄准尽可能少的耦合,所以IEnumerable<T>如果这足够就返回.它可能会.
IList<T>如果情况需要调用者获得可用于添加/插入/删除的List,则返回an .但即便如此,如果调用者从IEnumerable集合创建自己的List也可能会更好.
Ale*_*rey 13
这取决于你想要对结果做什么.如果您需要获取项目数或随机访问单个项目,请使用IList.
如果调用者只想迭代这些项,那么请使用IEnumerable - 但是你应该记录是否会延迟评估返回的值 - 这些天的许多IEnumerable实例表示在枚举集合时将执行的查询.为了安全起见,如果您要归还的内容不会按需评估,我会选择IList.
一般来说,最好 return IEnumerable<T>,只要它有调用者需要的一切。
IEnumerable<T>是 foreachable,这是许多消费者所需要的。它也是只读的,这通常是一件好事——这意味着您有时可以通过返回实际的支持集合进行优化,而不必担心有人在不告诉您的情况下对其进行了修改。
但是,如果消费者需要不在 上的方法IEnumerable<T>,那么IList<T>可能更有意义。例如,调用者可能想要调用Contains,而该调用不在 上IEnumerable<T>。或者调用者可能想要索引到列表中,而不是从头到尾迭代它。
但是您也可以IEnumerable<T>通过 LINQ 的Contains和ElementAt扩展方法进行包含和索引。所以这里有一个学位问题。如果调用者只需要问一个在 上不可用的问题IEnumerable<T>,例如“这是空的”,则返回 anIEnumerable<T>并使用Any扩展方法。但是如果调用者IList<T>广泛使用操作,则返回IList<T>。