使用索引迭代数组并根据索引分配值

时间:2012-10-25 20:31:26

标签: c# c#-4.0 design-patterns

我今天早些时候面对的是this problem,由于我找不到令人满意的解决方案,我决定改变我的班级设计,并拥有分离属性,如标签1,标签2,标签3等

我的主要问题是我需要将网格绑定到包含其他属性列表的对象,我需要将列表中的每个项目显示为单独的列,我无法做到。因此,我正在分别声明变量。 Original question is here...

现在,我正面临着一个最常见的设计问题,可能是每个程序员在某些时候都会遇到的问题。这是演示它的代码,

for (int i = 0; i < tags.Length; ++i) // Length not known here.
{
    if(i==0){
        tag1 = tags[0];
    } 
    else if(i == 1){
        tag2 = tags[1];
    }
    else if(i == 2){
        tag3 = tags[2];
    }
    ....
}

此处tags是一个字符串数组。

我想知道是否有更优雅的方式来做到这一点。另外需要注意的是,这个循环的效率随着它的进展而降低,因为随着迭代次数的增加,它必须检查更多的条件。如果我们可以在 true一次后删除一个条件,它会加快每次迭代,因为我们知道每个条件在所有迭代中只变为 true

3 个答案:

答案 0 :(得分:7)

移动了关于DataGridView的答案并使用ComponentModel来回答正确的问题: Displaying a list of object containing a list in a grid view

<强>简报

DataGridView控件支持ComponentModel命名空间,以便您可以创建看似具有不存在的属性的类。它与PropertyGrid使用的机制相同。

示例代码在这个问题的答案中: https://stackoverflow.com/a/13078735/195417

OLD ANSWER

这是我之前的回答,当时我没有意识到真正的问题是关于DataGridView控制。


这与直接设置值不同:

this.tag1 = tags[0];
this.tag2 = tags[1];
this.tag3 = tags[2];

编辑:正如您所说,您不知道需要多少变量,那么您只需要一个变量,这就是一个列表:

var list = new List<string>();
for (int i = 0; i < tags.Length; ++i)
{
    list.add(tags[i]);
}

如果你想要的只是复制所有值,你甚至可以这样做:

var list = new List<string>(tags);

告诉我这是否是你想要的......也许我误解了这个问题。

答案 1 :(得分:1)

整个循环毫无意义。但除非标签数组长度总是相同,否则你必须确保不会超出界限......

if(tags.Length >= 1) this.tag1 = tags[0];
if(tags.Length >= 2) this.tag2 = tags[1];
if(tags.Length >= 3) this.tag3 = tags[2];
if(tags.Length >= 4) this.tag4 = tags[3];
if(tags.Length >= 5) this.tag5 = tags[4];

......等等很多this.tag#you have。

答案 2 :(得分:-3)

这基本上是相同的:

for(int index = 0; index < tags.Length[]; index++){
    switch(index){
        case 0:
            tag1 = tags[0];
            break;
            // And so on
    }
}