5

現在使用しているライブラリをリファクタリングしていますが、次の問題に直面しています。

以前は次のものがありました。

class Blah
{
    float[][] data;
    public float[] GetDataReference(int index)
    {
        return data[index];
    }
}

さまざまな理由から、このギザギザ配列バージョンを 1 次元配列バージョンに置き換え、内部配列を連結しました。私の質問は:どうすればサブ配列への参照を返すことができdataますか?

class Blah
{
    float[] data;
    int rows;

    public float[] GetDataReference(int index)
    {
        // Return a reference data from offset i to offset j;
    }
}

私は安全でないものやポインターが役立つかもしれないと考えていましたが、それは可能ですか?

4

2 に答える 2

10

いいえ、これを行うことはできませんが、ArraySegment代わりに使用を検討する必要があります。

配列オブジェクトは、その長さなどに関するメタデータと、データ自体で構成されていることに注意してください。既存の配列のスライスを作成しても、データの横にメタデータを保持することはできません。つまり、私が言っていることを理解している場合は、追加のレベルの間接参照が必要になります(これがArraySegment提供されます)。

(ArraySegmentが、たとえばを実装するなどして、これ以上ラッピングを行わないことに少し驚いていますIList<T>が、そこに行きます。必要に応じて、このような構造を作成するのは簡単です。)

于 2010-04-08T09:01:39.243 に答える
1

SOで次の質問を確認しますが、受け入れられた回答は使用せず(結局コピーしたくない)、元の配列のスライス/サブパートに列挙子を使用する他のオプションに従います。

C#の配列スライス

于 2010-04-08T09:03:59.977 に答える