ICollection <T>是否有订单?

Ian*_*oyd 27 c# collections icollection

遵循公共API永远不会返回列表的规则,我正在盲目转换返回列表的所有代码,ICollection<T>而是返回:

public IList<T> CommaSeparate(String value) {...}
Run Code Online (Sandbox Code Playgroud)

变

public ICollection<T> CommaSeparate(String value) {...}
Run Code Online (Sandbox Code Playgroud)

虽然a ICollection有a Count,但是没有办法通过该索引获取项目.

虽然ICollection公开了一个枚举器(允许foreach),但我不能保证枚举的顺序从列表的"顶部"开始,而不是"底部".

我可以通过避免使用来减轻这种情况ICollection,而是使用Collection:

public Collection<T> Commaseparate(String value) {...}
Run Code Online (Sandbox Code Playgroud)

这允许使用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)
Run Code Online (Sandbox Code Playgroud)

pho*_*oog 15

该ICollection<T>接口不指定有关订单的任何东西.对象将按返回的对象指定的顺序排列.例如,如果返回a的Values集合SortedDictionary,则对象将按照字典的比较器定义的顺序.

如果您需要通过契约返回合同需要某个订单的类型的方法,那么您应该通过返回更具体的类型在方法的签名中表示.

无论返回的对象的运行时类型如何,请考虑静态引用时的行为IList<T>或ICollection<T>:当您调用时GetEnumerator()(可能隐式地在foreach循环中),您将调用相同的方法并获取相同的对象,而不管静态参考类型.因此,无论CommaSeparate()方法的返回类型如何,它都将以相同的方式运行.

额外的想法:

正如其他人指出的那样,FXCop规则警告不要使用List<T>,而不是IList<T>; 你联系的问题是询问为什么FXCop不建议使用IList<T>代替List<T>,这是另一回事.如果我想你正在解析一个命令行字符串,其中顺序很重要,IList<T>如果我是你,我会坚持.


dgv*_*vid 9

ICollection没有保证顺序,但实际实现它的类可能(或可能不).

如果你想要返回一个有序的集合,那么返回一个IList<T>并且不要太依赖FxCop通常合理但非常通用的建议.


afe*_*gin 5

不,ICollection 并不意味着订单。