c#减少嵌套循环(代码片段)

author author     2022-11-30     739

关键词:

最近在解决性能优化的问题,看到了一堆嵌套循环,四五层级的循环真的有点过分了,在数据量成万,十万级别的时候,真的非常影响性能。

当然,除了关注明显的循环例如for、foreach,还应该关注隐晦一点的循环,例如datatable.select(),linq之类的list.where、list.find等。

要优化,排除业务问题,要考虑的就是代码技术了。看到循环查找数据,尽可能向Dictionary靠拢。

eg1:一个简单的key对应一条datarow

优化前:

using System.Linq;

namespace ConsoleApp1

    internal class Program
    
        private static void Main(string[] args)
        
            DataTable table = new DataTable();
            ...
            for (int i = 0; i < 1000000; i++)
            
                var row = table.AsEnumerable().FirstOrDefault(r => r["num"].ToString() == i.ToString());
                ...
            
        
    

优化后:

using System.Data;
using System.Linq;

namespace ConsoleApp1

    internal class Program
    
        private static void Main(string[] args)
        
            DataTable table = new DataTable();
            ...
            var dict = table.AsEnumerable().ToDictionary(r => r["num"].ToString());
            for (int i = 0; i < 1000000; i++)
            
                if (dict.ContainsKey(i.ToString()))
                
                    var row = dict[i.ToString()];
                
                ...
            
              
    

 eg2:一个拼装的Key对应多条DataRow的字典

优化前:

using System.Data;
using System.Linq;

namespace ConsoleApp1

    internal class Program
    
        private static void Main(string[] args)
        
            DataTable table = new DataTable();   
            ...
            for (int i = 0; i < 1000000; i++)
            
                var name = "";
                ...
                var rows = table.AsEnumerable().Where(r => r["num"].ToString() == i.ToString() && r["name"].ToString() == name);
            
                     
    

优化后:

using System.Data;
using System.Linq;

namespace ConsoleApp1

    internal class Program
    
        private static void Main(string[] args)
        
            DataTable table = new DataTable();
            var group = table.AsEnumerable().GroupBy(r => GetGroupKey(r["num"].ToString(), r["name"].ToString()));
            var dict= group.ToDictionary(r=>r.Key);
            ...
            for (int i = 0; i < 1000000; i++)
            
                var name = "";
                var key = GetGroupKey(i.ToString(), name);
                if (dict.ContainsKey(key))
                
                    var rows = dict[key];
                               
                ...
            
              
       
        private static string GetGroupKey(string _num,string _name)
        
            return $"num=_num|name=_name";
        
    

 

使用具有多个参数和索引的lapply/sapply减少函数内的嵌套循环(代码片段)

我有两个观察向量,我想要计算哪些参数最适合这些观察。因此,我已经定义了似然函数。我正在努力从嵌套for循环到使用sapply。我的目标是返回观察“芽”概率的(50x1)向量。>bud[1]1.721.121.011.141.561.041.001.391.38[10]0.991.661.552.2... 查看详情

如何实现滑动窗口或减少这些嵌套循环?

】如何实现滑动窗口或减少这些嵌套循环?【英文标题】:Howtoimplementslidingwindoworreducethesenestedloops?【发布时间】:2020-03-1900:09:36【问题描述】:我正在尝试减少这些循环以优化一些代码。有人建议我使用滑动窗口技术,但我似... 查看详情

代码规范(代码片段)

7.3.10尽量减少循环嵌套层次。7.3.11避免循环体内含判断语句避免循环体内含判断语句,应将循环语句置于判断语句的代码块之中。说明:目的是减少判断次数。循环体中的判断语句是否可以移到循环体外,要视程序的具体情况而... 查看详情

代码规范(代码片段)

7.3.10尽量减少循环嵌套层次。7.3.11避免循环体内含判断语句避免循环体内含判断语句,应将循环语句置于判断语句的代码块之中。说明:目的是减少判断次数。循环体中的判断语句是否可以移到循环体外,要视程序的具体情况而... 查看详情

如何从 C# 中的嵌套循环写入多维数组?

】如何从C#中的嵌套循环写入多维数组?【英文标题】:HowtowritetomultidimensionalarrayfromnestedloopinC#?【发布时间】:2020-07-0315:44:38【问题描述】:我是C#新手。我在Unity中编写了一个代码,它创建了多个(9,3x3)多维数据集,并且我使用... 查看详情

如何打破嵌套的foreach循环然后转到c#上的父foreach循环

】如何打破嵌套的foreach循环然后转到c#上的父foreach循环【英文标题】:Howtobreaknestedforeachloopthengotoparentforeachlooponc#【发布时间】:2013-07-0913:47:31【问题描述】:我有以下代码:foreach(//Someconditionhere)while(//Someconditionhere)foreach(//Somec... 查看详情

嵌套循环概念(代码片段)

嵌套循环:循环体中还可以声明循环,相当于内层循环的整体充当外层循环的循环体例:for(;;)for(;;)或者while()for(;;)题目:输出四排*,要求用嵌套循环**********publicclassVpublicstaticvoidmain(String[]args)for(inti=0;i<4;i++)for(intj=0;j<i+1;j++)S 查看详情

如何减少python中嵌套循环的时间

】如何减少python中嵌套循环的时间【英文标题】:howtoreducethetimeofanestedloopinpython【发布时间】:2022-01-0417:59:16【问题描述】:我正在从ESPN获取球员数据,但我发现自己的问题是获取每个变量的等待时间很长,如何提高效率?playe... 查看详情

C#:循环遍历嵌套结构的成员对象

】C#:循环遍历嵌套结构的成员对象【英文标题】:C#:Loopingthroughmemberobjectsofnestedstructs【发布时间】:2021-12-2718:06:42【问题描述】:大家好,所有c#向导!我需要将(打包的)嵌套结构的所有内存偏移值存储在这些各自的结构中... 查看详情

python入门-4控制语句:07嵌套循环-练习(代码片段)

嵌套循环及练习:  一个循环体内可以嵌入另一个循环,一般称为“嵌套循环”,或者“多重循环”。【练习】1#测试嵌套循环2forxinrange(5):3foryinrange(5):4print(x,end=‘\t‘)5print()#起到换行的作用67print(‘###################... 查看详情

constraintlayout使用详解,减少嵌套ui,提升性能(代码片段)

前言对于初学者来说,可能觉得ConstraintLayout属性多,且属性长而弃用它,那你错失了这个大宝贝。因为在复杂布局,我们会一直用RelativeLayout和LinearLayout去嵌套,因为嵌套的ViewGroup会导致手机多次测量和绘制&#... 查看详情

java[嵌套循环]#java#forloop(代码片段)

查看详情

while循环嵌套需要注意的点,(代码片段)

在whileTrue的循环嵌套中循环套循环内,子循环被break或者continue后,如果子循环后面没有和他属于同一权力的,就会返回上一循环,继续循环下去但是如果有和他属于同一权力的(也就是在子循环下面的代码和子循环同一列的)子循... 查看详情

python入门-4控制语句:09循环代码优化技巧(重要)-zip()并行迭代(代码片段)

...提高运行效率,避免不必要的低效计算:    1.尽量减少循环内部不必要的计算    2.嵌套循环中,尽量减少内层循环的计算,尽可能向外提。    3.局部变量查询较快,尽量使用局部变量  其他优化手段:   ... 查看详情

流程控制与循环(代码片段)

...行代码块Belse:?代码块C#以上条件均不成立时运行代码块C嵌套ifif条件A:?if条件B:?代码块#条件A成立,并且条件B成立时运行代码块while循环while条件A:代码块A(循环体)#当条件A成立时,运行循环体else:代码块B#当条件 查看详情

嵌套循环有两个while循环(代码片段)

所以我必须提出一个输出报告的代码,我必须在另一个while循环中包含这个while循环,这个循环会询问用户是否要继续输入信息。只要用户响应“Y”,继续询问所需输入并打印报告。一旦用户回答“N”,则停止进一步处理。我刚... 查看详情

循环嵌套(代码片段)

n=int(input(‘请输入一个整数:‘))#控制打印多少行foriinrange(n):#控制一行打印多少个forjinrange(1+i):print(j,‘*‘,end=‘‘)print()‘‘‘n=int(input(‘请输入一个整数:‘))#先控制行数foriinrange(n):#控制每一行的打印个数forjinrange(i+1):print(j+1,... 查看详情

o纬度减少循环次数(代码片段)

O(1)纬度减少循环次数 平时看淡,不服就干。老子有句粗口话不知道当不当讲,我们公司上一次发工资时4月4号,时至今日5-30已经有57天没有发工资了,我还要继续坚持下去吗?难不成现在大家工作都TM的不在乎钱了的吗?使... 查看详情