You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

优化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 15:09:24