0

我今天早些时候遇到了这个问题,由于找不到令人满意的解决方案,我决定改变我的类设计,并具有单独的属性,例如 Tag 1、Tag 2、Tag 3 等。

我的主要问题是我需要将网格绑定到包含其他属性列表的对象,并且我需要将列表中的每个项目显示为单独的列,这是我无法做到的。因此,我诉诸单独声明变量。原始问题在这里...

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

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是一个字符串数组。

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

4

3 回答 3

7

DataGridView将关于和使用的答案移至ComponentModel正确的问题: 在网格视图中显示包含列表的对象列表

简报

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

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

旧答案

这是我之前的回答,当时我没有意识到真正的问题是关于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);

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

于 2012-10-25T20:35:17.790 回答
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#。

于 2012-10-25T21:05:19.453 回答
-3

这本质上是相同的:

for(int index = 0; index < tags.Length[]; index++){
    switch(index){
        case 0:
            tag1 = tags[0];
            break;
            // And so on
    }
}
于 2012-10-25T20:41:33.240 回答