按照公共API不应返回列表的规则,我正在将所有返回列表的代码盲目转换为返回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>
。 - Chris Shain