1

リストがあり、以下に示すように winform テキストボックスを追加しましたが、カウントが 0 から始まるため、リストは 0 ベースです。1 ベースにするにはどうすればよいですか?

List<TextBox> textBoxList = new List<TextBox>();
textBoxList.Add(textBox1);
textBoxList.Add(textBox2);
textBoxList.Add(textBox3);
textBoxList.Add(textBox4);
textBoxList.Add(textBox5);
textBoxList.Add(textBox6);
textBoxList.Add(textBox7);
textBoxList.Add(textBox8);
textBoxList.Add(textBox9);
textBoxList.Add(textBox10);
textBoxList.Add(textBox11);
textBoxList.Add(textBox12);

1 から 12 までの任意の数のインデックスがあります。このインデックスを使用して正しいテキスト ボックスを見つけたいので、インデックス 6 はテキスト ボックス 5 ではなくテキスト ボックス 6 になります。

4

6 に答える 6

3

.NETのリストを1ベースにすることはできませんが、(1)読み取るたびにインデックスを1つずつ下げるか、(2)位置0に不要なエントリを挿入して、その後は無視することができます(非推奨)。

リストから継承して、出入りの途中でインデックスを調整する独自のデータ構造を構築することはできますが、読者間の混乱の量は言うまでもなく、さらに多くの労力が必要になるため、これを行うことには強く注意します。 。

于 2012-09-21T09:19:45.943 に答える
2

リスト/配列アクセスは本質的にゼロインデックスベースであり、これに逆らおうとするカスタム実装は混乱を招きます(これがその性質である場合、私は個人的にクラスにその性質を説明する名前を付けると思います、他の場所で特定のケースのロジックを実行するよりも難しいでしょう)。

ユースケースは何ですか?通常、インデックス値をインクリメントして、ユーザーにとって意味のある「現在の」値または「カウント」値を表すか、ユーザーの観点から必要なものに入力を調整することで解決できますが、特定のケースは何ですか?

更新に基づいて、インデックスによる制御を取得したい場合は、インデックスを0から開始するか、前述のように入力を調整できます(配列で必要なオフセットに応じて入力を減らすことにより)-これは他の方法と同じように、簡単ではないにしても、誰もが理解できるほど簡単です。

于 2012-09-21T09:19:57.963 に答える
1

多分あなたの場合、辞書を使用する方が良いでしょうか? したがって、コードは次のように変換されます。

Dictionary<int, TextBox> textBoxes = 
        new Dictionary<int, TextBox>();
textBoxes.Add(1, textBox1);

しかし、とにかくそれは奇妙な要件です。

于 2012-09-21T09:34:16.573 に答える
0

コレクションのインデックスを 1 ベースにするという問題を解決するやや厄介な方法の 1 つは、Arrayクラスを使用することです。その後、任意の下限を持つ配列インスタンスを作成できます。あなたの場合、次のようになります。

var textBoxList = Array.CreateInstance(typeof(TextBox), new[] {12}, new[] {1});

この配列の要素を定義するのはやや面倒です:

...
textBoxList.SetValue(textBox5, 5);
...

同様に、要素へのアクセスもかなり明示的です。

var tb9ref = (TextBox)textBoxList.GetValue(9);
于 2012-09-21T10:04:35.780 に答える
0

組み込みクラスを拡張する独自のリスト クラスを定義し、コンストラクト関数に最初の要素を挿入できます。

于 2012-09-21T09:26:54.753 に答える
-1

私がやったことはheresで、うまくいくようです:D、簡単だと思います..まだ学んでいます..

                                    var tb = textBoxList;
                                    int newDef = def - 1;
                                    tb[newDef].Text = "occupied";   
于 2012-09-21T09:47:23.087 に答える