たとえば、サブインデックス1の配列をC#で初期化することは可能ですか?
私はOffice相互運用機能を使用していますが、すべてのプロパティは1で始まるオブジェクト配列であり(元々はVB.NETでプログラムされていたと思います)、変更することはできません。配列全体を設定して、変更します。
回避策として、元の配列のクローンを作成し、その配列を変更して、完了したら全体として設定します。
しかし、私は新しい非ゼロベースの配列を作成することが可能かどうか疑問に思いました
たとえば、サブインデックス1の配列をC#で初期化することは可能ですか?
私はOffice相互運用機能を使用していますが、すべてのプロパティは1で始まるオブジェクト配列であり(元々はVB.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);
使用できますArray.CreateInstance
。
.NET の配列型を参照してください。
単純ではありません。しかし、確かに独自のクラスを作成できます。プライベート変数として配列があり、ユーザーは自分の配列が 1 から始まると考えるでしょうが、実際にはゼロから始まり、すべての配列アクセスから 1 を引いています。
独自の配列クラスを作成できます
配列の開始インデックスを変更できるかどうかはわかりません。
ジェネリックを使用して独自の配列を作成し、内部で処理します。
値が 1 の「オフセット」という名前の const int を保持し、常にコード内の添字に追加します。
C# で非ゼロベースの配列を作成できるとは思いませんが、組み込みのデータ構造の周りに独自のラッパー クラスを簡単に作成できます。このラッパー クラスは、必要な配列型のプライベート インスタンスを保持します。[] インデックス演算子のオーバーロードは許可されていませんが、クラスにインデクサーを追加して、インデックス可能な配列のように動作させることができます。こちらを参照してください。作成したインデックス関数は、渡されたすべてのインデックスに 1 を加算 (または減算) できます。
次に、オブジェクトを次のように使用すると、正しく動作します。
myArrayObject[1]; //would return the zeroth element.
VB6 では、配列を 0 または 1 で開始するように変更できたので、VBScript でも同じことができると思います。C# の場合は不可能ですが、最初の [0] に NULL 値を追加し、[1] から実際の値を開始するだけです。もちろん、これは少し危険です...