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のみを使用したいのですが、クラスは固定サイズですがAdd、のような多くのメソッドを実装する必要があります。RemoveAt
  • そして私の質問: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(returning )すると同時に、正しい型を返すプロパティを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によるものです:

1次元配列は、インターフェイス(略して)とそのベースインターフェイスをS[]実装します。したがって、からおよびそのベースインターフェイスへの暗黙の変換があります。System.Collections.Generic.IList<S>IList<S>S[]IList<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 に答える