質問

C# で、たとえばサブインデックス 1 で配列を初期化することは可能ですか?

私は Office 相互運用機能を使用していますが、すべてのプロパティは 1 で始まるオブジェクト配列 (元々は VB.NET でプログラムされたものだと思います) であり、変更することはできません。プロパティを受け入れるには配列全体を設定する必要があります。変化します。

回避策として、元の配列のクローンを作成し、それを変更し、完了したら全体として設定します。

しかし、ゼロ以外の新しい配列を作成できるかどうか疑問に思っていました。

役に立ちましたか?

解決

使用できます Array.CreateInstance.

見る .NET の配列型

他のヒント

以下のコードを参照して、リクエストどおりに実行することが可能です。

// Construct an array containing ints that has a length of 10 and a lower bound of 1
Array lowerBoundArray = Array.CreateInstance(typeof(int), new int[1] { 10 }, new int[1] { 1 });

// insert 1 into position 1
lowerBoundArray.SetValue(1, 1);

//insert 2 into position 2
lowerBoundArray.SetValue(2, 2);

// IndexOutOfRangeException the lower bound of the array 
// is 1 and we are attempting to write into 0
lowerBoundArray.SetValue(1, 0);

単純ではありません。ただし、独自のクラスを作成することもできます。プライベート変数として配列があり、ユーザーは自分の配列が 1 から始まると考えますが、実際には 0 から始まり、すべての配列アクセスから 1 を減算することになります。

独自の配列クラスを作成できます

配列の開始インデックスを変更できるかどうかはわかりません。

ジェネリックを使用して独自の配列を作成し、内部で処理します。

値 1 の「offset」という名前の const int を保持し、常にそれをコード内の添字に追加してください。

C# ではゼロ以外のベースの配列を作成できるとは思いませんが、組み込みデータ構造の周囲に独自のラッパー クラスを簡単に作成できます。このラッパー クラスは、必要な配列型のプライベート インスタンスを保持します。[] インデックス演算子のオーバーロードは許可されていませんが、クラスにインデクサーを追加して、クラスをインデックス可能な配列のように動作させることができます。を参照してください。 ここ. 。作成したインデックス関数は、渡されたすべてのインデックスに 1 を加算 (または減算) することができます。

次に、オブジェクトを次のように使用すると、正しく動作します。

myArrayObject[1]; //would return the zeroth element.

VB6 では配列を 0 または 1 から始まるように変更できたので、VBScript でも同じことができると思います。C# の場合は不可能ですが、最初の [0] に NULL 値を追加し、実際の値を [1] から開始するだけです。確かに、これはちょっと危険です…。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top