提供哪种参数类型是IEnumerable并具有Count?

时间:2017-01-08 01:14:39

标签: c# .net arrays generics

通常情况下,提供接受数组的方法可以进行优化,以接受IEnumerable并且需要CountLength的更通用的类。

示例:

public static T NextObject<T>(this Random random, T[] array)
{
    return array[random.Next(array.Length)];
}

在这里,我使用Array来获取特定元素,知道元素的数量。哪种类最适合这种方式?

  • 的IList
  • ICollection - 也有Count
  • 其他接口或类或一组不同的接口?

认为IEnumerable可能不是一个好主意,因为如果底层枚举器更复杂,Count()会对性能产生副作用。

2 个答案:

答案 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)。