c#我如何使我的列表1基于而不是基于0

时间:2012-09-21 09:16:50

标签: c# list

我有一个列表,我已经将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将是textbox 6 ..而不是textbox 5

6 个答案:

答案 0 :(得分:3)

您不能将.NET列表设置为一个,但您可以(1)每次读取时将索引调低一个,或者(2)在位置0处插入无用的条目并在之后忽略它(不推荐)。

您可以从列表继承,并构建自己的数据结构,在进出的路上调整索引,但这需要更多的努力,更不用说读者之间的混淆,所以我会强烈提醒反对这样做。

答案 1 :(得分:2)

事情不是这样做的 - 列表/数组访问本质上是基于零索引的,并且尝试无视这种情况的自定义实现会令人困惑(我个人认为命名一个类来描述其性质,如果这样如果是它的性质,将比在其他地方为特定案例做逻辑更难。)

用例是什么?通常,您可以通过递增索引值来表示对用户有意义的“当前”或“计数”值,或者可以从用户角度调整输入到所需的值,但是你的具体情况是什么?

如果根据您的更新,您想要做的是通过索引获得控件,您可以从0开始索引或调整输入(如根据数组中所需的偏移量减少它) - 与任何其他方法一样,这对于任何人来说都是如此简单,如此简单易懂,直截了当。

答案 2 :(得分:1)

也许在你的情况下,使用Dictionary会更好吗?因此,您的代码将转换为:

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

但无论如何这是一个奇怪的要求。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

解决使收集索引从1开始的问题的一个相当尴尬的方法是使用Array类。然后,您可以创建具有任意下限的数组实例。在你的情况下,它看起来像这样:

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

定义此数组中的元素有点麻烦:

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

同样,访问元素也很明确:

var tb9ref = (TextBox)textBoxList.GetValue(9);

答案 5 :(得分:-1)

继续我做了什么,它似乎工作:D,简单到我猜...还在学习..

                                    var tb = textBoxList;
                                    int newDef = def - 1;
                                    tb[newDef].Text = "occupied";