【发布时间】:2012-02-03 17:37:32
【问题描述】:
按照a public APIs should never return a list 的规则,我正在盲目转换所有返回列表的代码,改为返回ICollection<T>:
public IList<T> CommaSeparate(String value) {...}
变成
public ICollection<T> CommaSeparate(String value) {...}
虽然ICollection 有Count,但无法通过该索引获取项目。
虽然ICollection 公开了一个枚举器(允许foreach),但我认为不能保证枚举的顺序从列表的“顶部”开始,而不是“底部”。
我可以通过避免使用ICollection 来缓解这种情况,而是使用Collection:
public Collection<T> Commaseparate(String value) {...}
这允许使用Items[index] 语法。
不幸的是,我的内部实现构造了一个数组;我可以转换为返回IList 或ICollection,但不能作为Collection。
有没有办法按顺序访问集合中的项目?
这引出了一个更广泛的问题:ICollection 甚至 有 订单吗?
从概念上讲,想象我想解析一个命令行字符串。保持项目的顺序至关重要。
从概念上讲,我需要一个指示“有序”字符串元组集的合同。在API合约的情况下,为了表明顺序,以下哪项是正确的:
IEnumerable<String> Grob(string s)
ICollection<String> Grob(string s)
IList<String> Grob(string s)
Collection<String> Grob(string s)
List<String> Grob(string s)
【问题讨论】:
-
顺便说一句,我认为您误读了作为重构基础引用的原始文章。它说不要传递
List<T>(类)的实例,而不是IList<T>(接口)。如果接口需要索引访问,那么传递IList<T>是完全合法的恕我直言。 -
LINQ OrderBy 返回的 IOrderedEnumerable 怎么样?
标签: c# collections icollection