如何调整此项以提高性能,我总共需要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);
}
}
}
}
}
}
答案 0 :(得分:3)
我怀疑此解决方案可能会有任何性能提升,因为您需要处理布局中的每个项目并相应地将其投放到ASPxLabel
或ASPxTextBox
- 不是吗?所以你可以所做的一切都是使用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;
}