概述
当然,除了关注明显的循环例如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# 减少嵌套循环的资料请关注靠谱客其它相关文章!
最后
以上就是欣喜短靴为你收集整理的C# 减少嵌套循环的两种方法的全部内容,希望文章能够帮你解决C# 减少嵌套循环的两种方法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复