计算数组中的元素数

时间:2013-02-20 09:34:01

标签: c# arrays

System.Array类实现ICollection接口。 此接口有一个名为Count的公共属性,它提供了数组中元素的数量。

假设我声明了一个数组并访问其属性

Array numbers = Array.CreateInstance(typeof(int), 10);
Console.WriteLine(numbers.Count);

你可能会在屏幕上看到10。 但是,在数字之后放一段时间后,我无法看到Count属性。但是,有一个名为Length的属性。为什么会这样?

更新: 这是因为显式接口实现。由于还有另一个类似于我的问题,我决定重新说出来。 为什么要明确实现这个特定属性的设计决策?还有另一个具有相同功能Length的属性。那么为什么要解决提供明确实现的Count

的问题

4 个答案:

答案 0 :(得分:4)

您需要将其投射到ICollection

Array.ICollection.Count财产

  

此成员是显式接口成员实现。有可能   仅在将Array实例强制转换为ICollection时使用   接口

顺便说一下,这是一个副本:I can not access Count property of the array but through casting to ICollection !

更新

  

这是因为显式接口实现。既然有   另一个类似于我的问题,我决定重新说出来。为什么是   设计决定明确实施这一特定   属性?还有另一个具有相同功能的属性   长度。那么为什么要经历明确提供的麻烦呢?   实施了Count?

它从实现IList<T>的{​​{1}}继承。所以你可以问why array implements IList

答案 1 :(得分:2)

System.Array类显式实现ICollection接口。 只有在ICollection投放到Array

之后,您才能使用ICollection的方法
Array numbers = Array.CreateInstance(typeof(int), 10);
ICollection numbersCollection =  (ICollection)numbers;
Console.WriteLine(numbersCollection.Count);

Implicit and Explicit Interface Implementations

System.Array.Count实际使用Array.Length属性

int ICollection.Count
{
    get
    {
        return this.Length;
    }
}

答案 2 :(得分:1)

Count是从ICollection接口明确实现的。这就是为什么它是隐形的。您必须投射((ICollection) numbers).Count才能访问Count属性。

答案 3 :(得分:1)

我认为这不是编程问题,而是逻辑问题intension

你可能会问自己这两个问题:

<强> Q1 即可。是数组集合吗?

<强> Q2 即可。是集合数组吗?

在c#中,现有的实现告诉我们Q1的答案是:

A1 :是的,数组是集合。因此Array实现ICollection

Q2怎么样?这是一个类似的问题要求 是一匹马白马 ?你可能想看一下[When a white horse is not a horse]的答案。

使用Q2,我会回复: “我不知道,这是根据上下文。” 那么,可能的背景是什么?如果您传递一个数组作为接口实现ICollection,那么是的,这个集合也是一个数组。但是,除了具有相同接口的数组之外,您可能会传递另一个对象。那么,它一定是一个阵列吗?如果您对某些扩展感兴趣,[this answer]中的A3可能会让您知道。

因此,完全合理Array具有Length属性,并且Count属性来自ICollection的显式实现。