如何优化此代码?

问题描述:

当然,必须有许多方法来优化下面的代码,在这里我基本上已经确保了大量的文本框不为空,然后阅读它们的值:如何优化此代码?

if (foo1.Text.Length != 0 & bar1.Text.Length != 0) 
{ 
    output.Text += myStrings[i] + "/" + foo1.Text + "/" + bar1.Text; 
} 

if (foo2.Text.Length != 0 & bar2.Text.Length != 0) 
{ 
    output.Text += myStrings[i] + "/" + foo2.Text + "/" + bar2.Text; 
} 

if (foo3.Text.Length != 0 & bar3.Text.Length != 0) 
{ 
    output.Text += myStrings[i] + "/" + foo3.Text + "/" + bar3.Text; 
} 

if (foo4.Text.Length != 0 & bar4.Text.Length != 0) 
{ 
    output.Text += myStrings[i] + "/" + foo4.Text + "/" + bar4.Text; 
} 

if (foo5.Text.Length != 0 & bar5.Text.Length != 0) 
{ 
    output.Text += myStrings[i] + "/" + foo5.Text + "/" + bar5.Text; 
} 

if (foo6.Text.Length != 0 & bar6.Text.Length != 0) 
    output.Text += myStrings[i] + "/" + foo6.Text + "/" + bar6.Text; 

if (foo7.Text.Length != 0 & bar7.Text.Length != 0) 
{ 
    output.Text += myStrings[i] + "/" + foo7.Text + "/" + bar7.Text; 
} 

if (foo8.Text.Length != 0 & bar8.Text.Length != 0) 
{ 
    output.Text += myStrings[i] + "/" + foo8.Text + "/" + bar8.Text; 
} 

if (foo9.Text.Length != 0 & bar9.Text.Length != 0) 
{ 
    output.Text += myStrings[i] + "/" + foo9.Text + "/" + bar9.Text; 
} 

if (foo10.Text.Length != 0 & bar10.Text.Length != 0) 
{ 
    output.Text += myStrings[i] + "/" + foo10.Text + "/" + bar10.Text; 
} 

我会把重复的元素放在数组中,然后遍历它们。

TextBox[] foos = new TextBox[] { foo1, foo2, foo3, /* etc */ }; 
TextBox[] bars = new TextBox[] { bar1, bar2, bar3, /* etc */ }; 

for (int i = 0; i <= 10; i++) 
    if (foos[i].Text.Length != 0 && bars[i].Text.Length != 0) 
     output.Text += myStrings[i] + "/" + foos[i].Text + bars[i].Text; 

当然,如果元素确实顺序命名,您可以从窗体的控件集合仰视的控件,名称为“foo” + number.ToString()填充数组。

我就在刚刚循环控制这些文本框所在的集合,然后仅对文本框进行过滤,并检查和连接。

我也强烈建议使用StringBuilder而不是+ =。

+0

对于StringBuilder为+1。问题中的字符串连接将成为这里的主要无效问题,并且在似乎被使用的程度上,用户甚至可能会注意到这一点。 – 2009-02-12 15:57:21

+0

是的,你对StringBuilder可能是对的。目前,实际上需要很多秒才能生成所有字符串。感谢您的建议! – BeefTurkey 2009-02-12 16:08:44

+0

感谢您的高举,祝你好运! – 2009-02-12 20:52:32

你可以把foo1-foo10变成一个数组foo [10],并且它是一样的吧?这将允许您将其表达为一个简单的循环。

难道是可行做出的WebControl有文本框称为foo和酒吧,并具有类似的功能:

if (foo.Text.Length != 0 & bar.Text.Length != 0) 
    return myStrings[i] + "/" + foo.Text + "/" + bar.Text; 
else 
    return string.Empty; 

把那些页面上十个,然后使用:

output.Text = myControl1.FooBar + myControl2.FooBar + myControl3.FooBar + ... 

(仍然有点凌乱,但不太重复)

写一个函数,接受foo &酒吧类型。将所有foo1 & bar1传递给函数foo10和bar10以获取值。您还可以创建foo和bar数组,然后循环并调用该方法来获取字符串。

foreach (Control ctrl in Page.Controls) { 
     if (ctrl is TextBox) { 
      if (ctrl.Text.Length != 0) { 
       output.Text += myStrings[i] + "/" + ctrl.Text; 
      } 
     } 
} 

未经测试,但应该工作。有了这个你的文本框可以被命名为任何东西。

有很多方法来重构这个。您选择的方法取决于您的特定场景和需求。

  1. 做一个函数,它接受一个foo和酒吧作为参数和返回字符串,然后聚集在一个字符串生成器
  2. 把FOOS和酒吧为集合和循环遍历这些集合该字符串。在这种情况下,数组很有用,并提供了一种将数组相互索引的方法。
  3. 让项目2更进一步,并创建一个新的类FooBar,它将foo和bar组合在一起。这样你就可以创建一个FooBars集合,并且你不再有它们之间的隐式关联,现在它已经是明确的并且被编码了。
  4. 让项目3更进一步,并认识到你正在汇总一个字符串。如果您使用的是最新版本的c#,请利用LINQ中的Map/Reduce(.Select()。Aggregate())将您的FooBars转换为相应的字符串,然后将这些字符串聚合为输出。

这只是我头顶的东西。如果你更多地工作,我相信你可以做得更好。:)

(如果这是家庭作业,请添加作业标记。)

编辑:

我不禁想知道基于在另一您的评论的用户界面的一般设计发布说明需要“很多秒”才能将字符串连接在一起。 10个字符串本身是相当微不足道的时间,但这表明你的外部循环(这是产生i)是相当长的运行。

如果您处于可以*做出此类决定的位置,您确定您的用户界面对于手边的任务来说确实很好吗?一般来说,大量的文本框对是一个困难的用户界面。也许ListView会更合适。它会隐含地包​​含一个集合,所以你不必处理这个“十个文本框”的愚蠢,并且将会是一个更简单的用户界面,以供用户遵循。