gpt4 book ai didi

c# - ICollection 是否有订单?

转载 作者:IT王子 更新时间:2023-10-29 04:16:37 25 4
gpt4 key购买 nike

遵循 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]句法。

不幸的是,我的内部实现构造了一个数组;我可以转换为返回IListICollection , 但不是 Collection .

有没有办法按顺序访问集合中的项目?

这引出了一个更广泛的问题:ICollection 甚至一个订单吗?


从概念上讲,想象我想解析一个命令行字符串。保持项目的顺序至关重要。

从概念上讲,我需要一个指示“有序”字符串元组集的契约(Contract)。在 API 契约(Contract)的情况下,为了指示顺序,以下哪项是正确的:

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)

最佳答案

ICollection<T>接口(interface)没有指定任何关于订单的信息。这些对象将按照返回的对象指定的顺序排列。例如,如果您返回 Values收藏SortedDictionary ,对象将按照字典比较器定义的顺序排列。

如果您需要该方法按约定返回一个类型,而该类型的约定需要特定的顺序,那么您应该通过返回更具体的类型在方法的签名中表达这一点。

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

额外的想法:

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

关于c# - ICollection<T> 是否有订单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8750244/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com