有限的IList<>实施?

时间:2010-04-12 09:59:28

标签: c# arrays ilist

我正在做一些stats工作,想要重构以下方法:

public static blah(float[] array)
{
    //Do something over array, sum it for example.
}

但是,我不想使用float []而是使用某种索引可枚举(例如,对于非常大的数组,使用从磁盘动态加载)。 我创建了一个简单的界面,并希望使用它。

public interface IArray<T> : IEnumerable<T>
{
    T this[int j] { get; set; }
    int Length { get; }
}

我的问题是:

  • float []只继承IList,而不是IArray,而AFAIK则无法改变它。
  • 我想抛弃IArray并且只使用IList,但是我的类需要实现许多方法,例如AddRemoveAt,尽管它们是固定大小的
  • 然后我的问题:float []如何实现IList而它没有这些方法?

欢迎任何帮助。 干杯

3 个答案:

答案 0 :(得分:2)

  

float []只继承IList,而不是IArray,而AFAIK则无法改变它。

T的数组也实现了IList<T>和其他(但是这些并不总是在工具中显示,数组的几个方面由运行时特别包含)。

  

我想抛弃IArray并且只使用IList,但是我的类需要实现许多方法[...]

这是事实,但是这样的实现很快就会完成(如果你只需要非修改操作,你可以从修改方法中抛出NotImplementedException。)

在实践中只需几分钟即可完成,您的实施应该是可重复使用的。还有像ReadOnlyCollection<T>这样的类型可以帮助避免大量的工作。

  

然后我的问题:float []如何实现IList,而它没有这些方法?

类型可以显式实现接口方法。它们不是该类型的直接成员,但是转换为接口(或反射)将允许访问。这允许类型化集合实现IEnumerator.Current(返回Object),同时还提供返回正确类型的Current属性。

答案 1 :(得分:1)

事实上,float[] array确实实现了IList<float>

var floats = new[] { 1.0f, 2.0f, 3.5f };
var list = (IList<float>)floats;

这是19.6

  

一维数组S[]实现接口System.Collections.Generic.IList<S>(简称IList<S>)及其基接口。因此,存在从S[]IList<S>及其基接口的隐式转换。

答案 2 :(得分:0)

我最后写了以下内容:     公共类IArrayWrapper:IArray     {         private float [] innerArray;

    public IArrayWrapper(float[] array)
    {
        innerArray = array;
    }

    public static implicit operator float[](IArrayWrapper wrapper)
    {
        return wrapper.innerArray;
    }

    public static implicit operator IArrayWrapper(float[] array)
    {
        return new IArrayWrapper(array);
    }

    public IEnumerator<float> GetEnumerator()
    {
        return ((IEnumerable<float>) innerArray).GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return innerArray.GetEnumerator();
    }

    public float this[int j]
    {
        get { return innerArray[j]; }
        set { innerArray[j] = value; }
    }

    public int Length
    {
        get { return innerArray.Length; }
    }
}

我并不为此感到自豪,但我认为隐含的操作员应该解决我的问题......希望如此。