代码之家  ›  专栏  ›  技术社区  ›  BeefTurkey

如何优化此代码?

  •  3
  • BeefTurkey  · 技术社区  · 16 年前

    当然,必须有很多方法来优化以下代码,我基本上必须确保许多文本框不是空的,然后读取它们的值:

    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;
    }
    
    7 回复  |  直到 16 年前
        1
  •  9
  •   rix0rrr    16 年前

    我将把重复的元素放在数组中,然后循环它们。

    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()的控件来填充数组。

        2
  •  5
  •   Gerrie Schenck    16 年前

    我只需循环这些文本框所在的控件集合,然后只对文本框进行筛选,并检查和concat。

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

        3
  •  2
  •   Greg D    16 年前

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

    1. 生成一个将foo和bar作为参数并返回字符串的函数,然后在字符串生成器中聚合该字符串。
    2. 将foos和bars放入集合中并循环这些集合。在这种情况下,数组是有用的,并提供了一种相互索引数组的方法。
    3. 将项目2进一步,创建一个新的类foo bar,将foo和bar结合在一起。通过这种方式,您可以创建一个foobar集合,并且您不再在它们之间有隐式关联,现在它是显式的和代码化的。
    4. 进一步执行项目3,并认识到您正在聚合一个字符串。如果您使用的是C_的最新版本,请利用LINQ(.select().aggregate())中的map/reduce将foobar转换为相应的字符串,然后将字符串聚合为输出。

    这些都是我头脑中的东西。如果你做得更多,我相信你能做得更好。:)

    (如果这是作业,请添加作业标签。)

    编辑:

    我忍不住想知道,一般来说,根据您在另一篇文章中的评论,将字符串连接在一起需要“许多秒”,UI的设计是如何的。10个字符串本身是一个非常小的时间量,但这表明您的外部循环(正在生成 i )相当长的时间。

    如果您处于一个可以自由做出此类决定的位置,您是否确定您的UI实际上对手头的任务很好?一般来说,一大组成对的文本框是一个困难的用户界面。也许是 ListView 会更合适。它将隐式地包含一个集合,因此您不必处理这种“十个文本框”的愚蠢行为,而且对于您的用户来说,它将是一个更容易使用的UI。

        4
  •  1
  •   Vinay    16 年前

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

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

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

        6
  •  0
  •   Sol    16 年前

    你能把foo1-foo10做成一个数组吗,foo[10],对bar也是这样吗?这将允许您将其表示为一个简单的循环。

        7
  •  0
  •   teedyay    16 年前

    是否可以制作一个具有名为foo和bar的文本框并且具有如下功能的WebControl:

    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 + ...
    

    (还是有点凌乱,但不太重复。)