我今天早些时候面对的是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
答案 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
}
}