1

我正在做一些统计工作,并想重构以下方法:

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?

欢迎任何帮助。干杯

4

3 回答 3

2

float[] 只继承 IList,而不是 IArray,而且 AFAIK 没有办法改变它。

Array of T 也实现IList<T>和其他(但这些并不总是显示在工具中,Array 的几个方面作为运行时的特殊情况)。

我想放弃 IArray 而只使用 IList,但我的类需要实现许多方法 [...]

确实如此,但是这样的实现非常快(如果你只需要非修改操作,你可以NotImplementedException从修改方法中抛出一个)。

在实践中只需要几分钟就可以完成,并且您的实现应该是可重用的。还有一些类型ReadOnlyCollection<T>可以帮助避免很多这样的工作。

然后我的问题是:float[] 在没有这些方法的情况下如何实现 IList?

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

于 2010-04-12T10:07:09.957 回答
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[]toIList<S>及其基本接口的隐式转换。

于 2010-04-12T10:04:55.603 回答
0

我最终写了以下内容: public class 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; }
    }
}

我对此并不感到自豪,但我认为隐式运算符应该可以解决我的问题……希望如此。

于 2010-04-12T10:27:12.603 回答