替换嵌套的foreach以获得更好的性能

时间:2016-03-21 15:56:08

标签: c# asp.net

如何调整此项以提高性能,我总共需要200个文本框和200个标签才能获取其ID并根据ID设置文本值。

foreach (TabPage t in ASPxPageControl1.TabPages)
        {
            foreach (ASPxFormLayout formly in t.Controls)
            {
                foreach (LayoutGroup grp in formly.Items)
                {
                    foreach (LayoutItem itm in grp.Items)
                    {
                        foreach (var control in itm.Controls)
                        {

                            if (control is ASPxLabel)
                            {
                                string a = ((ASPxLabel)control).ID.Remove(((ASPxLabel)control).ID.Length - 4);
                                ((ASPxLabel)control).Text = fonction1(a);
                            }
                            else if (control is ASPxTextBox)
                            {
                                string b = ((ASPxTextBox)control).ID.Remove(((ASPxTextBox)control).ID.Length - 4);
                                ((ASPxTextBox)control).Text = fonction2(b);
                            }
                        }
                    }
                }
            }
        }

2 个答案:

答案 0 :(得分:3)

我怀疑此解决方案可能会有任何性能提升,因为您需要处理布局中的每个项目并相应地将其投放到ASPxLabelASPxTextBox - 不是吗?所以你可以所做的一切都是使用Linq的某种语法糖:

foreach(var c in ASPxPageControl1.TabPages
        .SelectMany(x => x.Controls)
        .SelectMany(x => x.Items)
        .SelectMany(x => x.Items)
        .SelectMany(x => x.Controls) { ... }

然而,这将产生或多或少相同的IL代码,因此性能没有得到改善。

无论如何,我怀疑你的性能问题 - 如果我对这段代码产生疑问,即使存在 - 来自这些代码。您应该明确考虑使用像DotTrace这样的分析工具,以便找出软件中哪些部分运行缓慢 - 您将被视为实际的大点。

答案 1 :(得分:1)

你不太可能改进嵌套的for each,因为这是Linq所做的全部内容,你可以通过不多次投射获得改进。例如。改变这个:

if (control is ASPxLabel)
{
    string a = ((ASPxLabel)control).ID.Remove(((ASPxLabel)control).ID.Length - 4);
    ((ASPxLabel)control).Text = fonction1(a);
}
else if (control is ASPxTextBox)
{
    string b = ((ASPxTextBox)control).ID.Remove(((ASPxTextBox)control).ID.Length - 4);
    ((ASPxTextBox)control).Text = fonction2(b);
}

到此:

var label = control as ASPxLabel

if (label != null)
{
    string a = label.ID.Remove(label.ID.Length - 4);
    label.Text = fonction1(a);
    continue;
}

var textBox = control as ASPxTextBox

if (textBox != null)
{
    string b = textBox.ID.Remove(textBox.ID.Length - 4);
    textBox.Text = fonction2(b);
    continue;
}