C# 減少嵌套循環的兩種方法
當然,除瞭關註明顯的循環例如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}"; } } }
量變會引起質變。
以上就是C# 減少嵌套循環的兩種方法的詳細內容,更多關於C# 減少嵌套循環的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- C#高效比較兩個DataTable數據差異化的方法實現
- C#獲取DataTable對象狀態DataRowState
- SQLServer批量插入數據的三種方式及性能對比
- C# 創建控制臺應用程序
- C# Datatable的幾種用法小結