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 将是文本框 6 .. 而不是文本框 5

4

6 回答 6

3

您不能使 .NET 的列表基于一个,但您可以 (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

您可以定义自己的列表类来扩展内置类并在构造函数中插入第一个元素。

于 2012-09-21T09:26:54.753 回答
0

解决使集合索引基于 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 回答
-1

这是我所做的,它似乎有效:D,我猜很简单..仍在学习..

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