优化C# Foreach复杂度:如何用LINQ同时处理两个列表?
TreeView多层循环的LINQ重构问题与优化
问题背景
处理TreeView逻辑时使用了多层嵌套foreach循环,发现存在内存性能问题,于是决定用LINQ重构代码。目前已移除前几层foreach,但最后一层遍历SignalUI的循环因需要用到typeof(SignalUI)的属性无法用LINQ替换,尝试过Join方法但没有效果,不清楚如何用LINQ同时处理两个列表。
原始代码
private void signalUITextBox_textchanged(object sender, EventArgs e) { for (int j = 0; j < _numberOfSelectedSlaves; j++) if (_currentNode.Parent.Parent.Text == mas.Slaves[j].Name) { int counter = 0; foreach (FrameUI frame in mas.Slaves[j].FrameList) { int signalcounter = 0; if(_currentNode.Text == mas.Slaves[j].FrameList[counter].FrameName) foreach (SignalUI signalui in frame.SignalList) { foreach (Control i in this.Controls) { if (i is TextBox) { var txtbox = (TextBox)sender; if (txtbox.Name == i.Name) { foreach (var k in typeof(SignalUI).GetProperties()) if (signalui.SignalName + k.Name == txtbox.Name) { mas.Slaves[j].FrameList[counter].SignalList[signalcounter].SetProperty(k.Name, Convert.ToString(txtbox.Text)); } } } } signalcounter++; } counter++; } } } private void signalUCheckBox_textchanged(object sender, EventArgs e) { var SlaveQuery = mas.Slaves.Where(slave => slave.Name == _currentNode.Parent.Parent.Text).First(); var FrameQuery = SlaveQuery.FrameList.Where(frame => frame.FrameName == _currentNode.Text).First(); var chkbox = (CheckBox)sender; var ControlQuery = this.Controls.OfType<CheckBox>().Where(control => control.Name == chkbox.Name).First(); }
优化后代码
感谢帮助,已移除所有嵌套循环,优化后代码如下:
private void signalUITextBox_textchanged(object sender, EventArgs e) { int j; int signalcounter = 0; int counter = 0; var txtbox = (TextBox)sender; var properties = typeof(SignalUI).GetProperties(); var SlaveQuery = mas.Slaves.Where(slave => slave.Name == _currentNode.Parent.Parent.Text).First(); var FrameQuery = SlaveQuery.FrameList.Where(frame => frame.FrameName == _currentNode.Text).First(); for (j = 0; j < _numberOfSelectedSlaves; j++) if (_currentNode.Parent.Parent.Text == mas.Slaves[j].Name) break; foreach (FrameUI frame in mas.Slaves[j].FrameList) { if (_currentNode.Text == mas.Slaves[j].FrameList[counter].FrameName) break; counter++; } foreach (SignalUI signalui in FrameQuery.SignalList) { var prop = properties.FirstOrDefault(p => signalui.SignalName + p.Name == txtbox.Name); if (prop != null) { mas.Slaves[j].FrameList[counter].SignalList[signalcounter].SetProperty(prop.Name, Convert.ToString(txtbox.Text)); } signalcounter++; } }
内容的提问来源于stack exchange,提问作者AlexS
相关产品推荐
相关产品推荐

