通常情况下,提供接受数组的方法可以进行优化,以接受IEnumerable
并且需要Count
或Length
的更通用的类。
示例:
public static T NextObject<T>(this Random random, T[] array)
{
return array[random.Next(array.Length)];
}
在这里,我使用Array
来获取特定元素,知道元素的数量。哪种类最适合这种方式?
Count
我认为,IEnumerable
可能不是一个好主意,因为如果底层枚举器更复杂,Count()
会对性能产生副作用。
答案 0 :(得分:2)
您需要按索引访问项目和集合中的项目数。您还希望在集合/界面中添加更少的成员
| IList<T> | ICollection<T> | IEnumerable<T> | T[]
Access by index | + | - | - | +
Count of items | + | + | - | +
Less unwanted members | - | + | + | ~
如您所见,ICollection和IEnumerable不符合您的需求。我没有看到选择IList或数组之间的巨大差异。 IList可能比数组更轻量级,但它有很多不需要的操作(添加,删除,清除),使用数组你可以使用params
,这通常很方便。
答案 1 :(得分:0)
您的方法应采用满足方法需求的最不具体的类型。尽可能减少可能的耦合。这是ICollection
public interface ICollection<T> : IEnumerable<T>, IEnumerable
由于ICollection<T>
和IEnumerable<T>
都不支持索引,因此无法正常工作。
数组太具体,但List<T>
或IList<T>
将满足您的需求,因为您需要按索引访问。否则,客户端(类的使用者)将需要强制转换为数组类型。
但是计数会对性能产生副作用
Count()
是System.Linq.Enumerable
的扩展方法。它将尝试转换为支持O(1)计数的类型,如ICollection(Count属性)。如果没有,那么它将遍历所有项目并计算它们,这将成为O(N)。