C# 減少嵌套循環(huán)的兩種方法
當(dāng)然,除了關(guān)注明顯的循環(huán)例如for、foreach,還應(yīng)該關(guān)注隱晦一點(diǎn)的循環(huán),例如datatable.select(),linq之類(lèi)的list.where、list.find等。
要優(yōu)化,排除業(yè)務(wù)問(wèn)題,要考慮的就是代碼技術(shù)了??吹窖h(huán)查找數(shù)據(jù),盡可能向Dictionary靠攏。
eg1:一個(gè)簡(jiǎn)單的key對(duì)應(yīng)一條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:一個(gè)拼裝的Key對(duì)應(yīng)多條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}"; } } }
量變會(huì)引起質(zhì)變。
以上就是C# 減少嵌套循環(huán)的兩種方法的詳細(xì)內(nèi)容,更多關(guān)于C# 減少嵌套循環(huán)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- C#用鏈?zhǔn)椒椒ū磉_(dá)循環(huán)嵌套
- C# 9.0新特性——擴(kuò)展方法GetEnumerator支持foreach循環(huán)
- c# 循環(huán)語(yǔ)句的使用方法
- C# 循環(huán)判斷會(huì)進(jìn)來(lái)幾次的實(shí)現(xiàn)代碼
- C# 使用WPF 用MediaElement控件實(shí)現(xiàn)視頻循環(huán)播放
- c#中l(wèi)ist.FindAll與for循環(huán)的性能對(duì)比總結(jié)
- C#中foreach循環(huán)對(duì)比f(wàn)or循環(huán)的優(yōu)勢(shì)和劣勢(shì)
- 淺談C#中的for循環(huán)與foreach循環(huán)
- C# for循環(huán)的經(jīng)典案例集錦
- C#使用FileStream循環(huán)讀取大文件數(shù)據(jù)的方法示例
- C# winform循環(huán)播放多個(gè)視頻
- C#中for循環(huán)、while循環(huán)循環(huán)執(zhí)行的方法
- C#使用foreach循環(huán)遍歷數(shù)組完整實(shí)例
相關(guān)文章
c# 使用handle.exe解決程序更新文件被占用的問(wèn)題
這篇文章主要介紹了c# 使用handle.exe解決程序更新文件被占用的問(wèn)題,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下2021-03-03C# InitializeComponent()方法案例詳解
這篇文章主要介紹了C# InitializeComponent()方法案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08C#操作SQLite數(shù)據(jù)庫(kù)之讀寫(xiě)數(shù)據(jù)庫(kù)的方法
這篇文章主要介紹了C#操作SQLite數(shù)據(jù)庫(kù)之讀寫(xiě)數(shù)據(jù)庫(kù)的方法,簡(jiǎn)單分析了C#針對(duì)SQLite數(shù)據(jù)庫(kù)的讀寫(xiě)及顯示等操作相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2016-07-07