当然,除了关注明显的循环例如for、foreach,还应该关注隐晦一点的循环,例如datatable.select(),linq之类的list.where、list.find等。
要优化,排除业务问题,要考虑的就是代码技术了。看到循环查找数据,尽可能向Dictionary靠拢。
eg1:一个简单的key对应一条datarow
优化前:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
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()); ... } } } } |
优化后:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
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的字典
优化前:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
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); } } } } |
优化后:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
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# 减少嵌套循环的资料请关注服务器之家其它相关文章!
原文链接:https://www.cnblogs.com/bibi-feiniaoyuan/p/14889527.html