C# 減少嵌套循環(huán)的兩種方法
當(dāng)然,除了關(guān)注明顯的循環(huán)例如for、foreach,還應(yīng)該關(guān)注隱晦一點(diǎn)的循環(huán),例如datatable.select(),linq之類的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)文章
Graphics.DrawImage繪制的圖像變大的原因分析及解決
這篇文章主要介紹了Graphics.DrawImage繪制的圖像變大的原因分析及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
C#實(shí)現(xiàn)基于XML配置MenuStrip菜單的方法
這篇文章主要介紹了C#實(shí)現(xiàn)基于XML配置MenuStrip菜單的方法,涉及C#使用XML配置MenuStrip菜單的原理與實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08
C# FileSystemWatcher 在監(jiān)控文件夾和文件時(shí)的使用方法
這篇文章主要介紹了C# FileSystemWatcher 在監(jiān)控文件夾和文件時(shí)的使用方法,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以參考下2020-06-06
C#多線程開發(fā)實(shí)戰(zhàn)記錄之線程基礎(chǔ)
線程是一個(gè)獨(dú)立的運(yùn)行單元,每個(gè)進(jìn)程內(nèi)部有多個(gè)線程,每個(gè)線程可以各自同時(shí)執(zhí)行指令,每個(gè)線程有自己獨(dú)立的棧,但是與進(jìn)程內(nèi)的其他線程共享內(nèi)存,這篇文章主要給大家介紹了關(guān)于C#多線程開發(fā)實(shí)戰(zhàn)記錄之線程基礎(chǔ)的相關(guān)資料,需要的朋友可以參考下2021-09-09

