C# 減少嵌套循環(huán)的兩種方法
更新時間:2021年06月17日 09:46:45 作者:舒碧
最近在解決性能優(yōu)化的問題,看到了一堆嵌套循環(huán),四五層級的循環(huán)真的有點過分了,在數(shù)據(jù)量成萬,十萬級別的時候,真的非常影響性能。本文介紹了C# 減少嵌套循環(huán)的兩種方法,幫助各位選擇適合自己的優(yōu)化方案,優(yōu)化程序性能
當然,除了關注明顯的循環(huán)例如for、foreach,還應該關注隱晦一點的循環(huán),例如datatable.select(),linq之類的list.where、list.find等。
要優(yōu)化,排除業(yè)務問題,要考慮的就是代碼技術了。看到循環(huán)查找數(shù)據(jù),盡可能向Dictionary靠攏。
eg1:一個簡單的key對應一條datarow
優(yōu)化前:
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()); ... } } } }
優(yōu)化后:
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的字典
優(yōu)化前:
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); } } } }
優(yōu)化后:
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}"; } } }
量變會引起質變。
以上就是C# 減少嵌套循環(huán)的兩種方法的詳細內容,更多關于C# 減少嵌套循環(huán)的資料請關注腳本之家其它相關文章!
您可能感興趣的文章:
- C#用鏈式方法表達循環(huán)嵌套
- C# 9.0新特性——擴展方法GetEnumerator支持foreach循環(huán)
- c# 循環(huán)語句的使用方法
- C# 循環(huán)判斷會進來幾次的實現(xiàn)代碼
- C# 使用WPF 用MediaElement控件實現(xiàn)視頻循環(huán)播放
- c#中l(wèi)ist.FindAll與for循環(huán)的性能對比總結
- C#中foreach循環(huán)對比for循環(huán)的優(yōu)勢和劣勢
- 淺談C#中的for循環(huán)與foreach循環(huán)
- C# for循環(huán)的經(jīng)典案例集錦
- C#使用FileStream循環(huán)讀取大文件數(shù)據(jù)的方法示例
- C# winform循環(huán)播放多個視頻
- C#中for循環(huán)、while循環(huán)循環(huán)執(zhí)行的方法
- C#使用foreach循環(huán)遍歷數(shù)組完整實例
相關文章
C# InitializeComponent()方法案例詳解
這篇文章主要介紹了C# InitializeComponent()方法案例詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下2021-08-08C#操作SQLite數(shù)據(jù)庫之讀寫數(shù)據(jù)庫的方法
這篇文章主要介紹了C#操作SQLite數(shù)據(jù)庫之讀寫數(shù)據(jù)庫的方法,簡單分析了C#針對SQLite數(shù)據(jù)庫的讀寫及顯示等操作相關技巧,具有一定參考借鑒價值,需要的朋友可以參考下2016-07-07