用法1 为原始类型扩展方法
先说一下,this 后面跟的类型,就是要拓展方法的类型。注意要写在静态类中的静态方法,不然有些情况下访问
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
/// <summary> /// 扩展类 用于为原始类扩展方法 /// </summary> public static class AM_Extends { /// <summary> /// 为string类扩展了一个child方法,实现某功能 /// </summary> /// <param name="str"></param> /// <param name="new_str"></param> public static void Child( this string str, string new_str) { object obj = str; str=new_str; } } 定义扩展方法 |
1
2
3
4
5
6
7
8
9
|
private void Form1_Load( object sender, EventArgs e) { string st1 = "123" ; string st2 = "" ; string st3 = "" ; st3 = st2.Child(st1); //st3的值为“123” } 调用实例 |
用法2 this代表当前类的实例对象
用法3 用this串联构造函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
public class Test { public Test() { Console.WriteLine( "无参构造函数" ); } // this()对应无参构造方法Test() // 先执行Test(),后执行Test(string text) public Test( string text) : this () { Console.WriteLine(text); Console.WriteLine( "有参构造函数" ); } } |
用法4 索引器(基于索引器封装EPList,用于优化大数据下频发的Linq查询引发的程序性能问题,通过索引从list集合中查询数据)
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
|
using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; namespace MyDemo.Web { /// <summary> /// EPList 支持为List创建索引 /// </summary> /// <typeparam name="T">类型</typeparam> public class EPList<T> { #region 成员变量 /// <summary> /// 索引 /// </summary> private List< string []> m_Index = new List< string []>(); /// <summary> /// 缓存数据 /// </summary> private Dictionary< string , List<T>> m_CachedData = new Dictionary< string , List<T>>(); /// <summary> /// List数据源 /// </summary> private List<T> m_ListData = new List<T>(); /// <summary> /// 通过索引值取数据 /// </summary> /// <param name="indexFields">索引字段</param> /// <param name="fieldValues">字段值</param> /// <returns></returns> public List<T> this [ string [] indexFields] { get { string key = string .Join( "," , indexFields); if (m_CachedData.ContainsKey(key)) return m_CachedData[key]; return new List<T>(); } } #endregion #region 公共方法 /// <summary> /// 创建索引 /// </summary> /// <param name="indexFields">索引字段</param> public void CreateIndex( string [] indexFields) { if (m_Index.Contains(indexFields)) return ; m_Index.Add(indexFields); } /// <summary> /// 添加 /// </summary> /// <param name="record">记录</param> public void Add(T record) { m_ListData.Add(record); m_Index.ForEach(indexFields => { string key = getKey(record, indexFields); if (m_CachedData.ContainsKey(key)) { m_CachedData[key].Add(record); } else { List<T> list = new List<T> { record }; m_CachedData.Add(key, list); } }); } #endregion #region 私有方法 /// <summary> /// 获取值 /// </summary> /// <param name="record">记录</param> /// <param name="fieldName">字段名</param> /// <returns></returns> private object getValue(T record, string fieldName) { Type type = typeof (T); PropertyInfo propertyInfo = type.GetProperty(fieldName); return propertyInfo.GetValue(record, null ); } /// <summary> /// 获取Key /// </summary> /// <param name="record">记录</param> /// <param name="indexFields">索引字段</param> private string getKey(T record, string [] indexFields) { List< string > values = new List< string >(); foreach (var field in indexFields) { string value = Convert.ToString(getValue(record, field)); values.Add(field + ":" + value); } return string .Join( "," , values); } /// <summary> /// 获取Key /// </summary> /// <param name="indexFields">索引字段</param> /// <param name="fieldValues">字段值</param> /// <returns></returns> private string getKey( string [] indexFields, object [] fieldValues) { if (indexFields.Length != fieldValues.Length) return string .Empty; for ( int i = 0; i < indexFields.Length; i++) { fieldValues[i] = indexFields[i] + ":" + fieldValues[i]; } string key = string .Join( "," , fieldValues); return key; } #endregion } } 创建EPList |
给EPList创建索引,并添加数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
private EPList<SysDepartInfo> GetEPListData() { EPList<SysDepartInfo> eplist = new EPList<SysDepartInfo>(); eplist.CreateIndex( new string [] { "ParentId" }); string sql = "select Id,ParentId,Code,Name from SysDepart" ; SqlHelper.ExecuteReader(sql, null , (reader) => { SysDepartInfo record = new SysDepartInfo(); record.Id = Convert.ToString(reader[ "Id" ]); record.ParentId = Convert.ToString(reader[ "ParentId" ]); record.Code = Convert.ToString(reader[ "Code" ]); record.Name = Convert.ToString(reader[ "Name" ]); eplist.Add(record); }); return eplist; } 给EPList创建索引,并添加数据 |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
private EPList<SysDepartInfo> GetEPListData() { EPList<SysDepartInfo> eplist = new EPList<SysDepartInfo>(); eplist.CreateIndex( new string [] { "ParentId" }); string sql = "select Id,ParentId,Code,Name from SysDepart" ; SqlHelper.ExecuteReader(sql, null , (reader) => { SysDepartInfo record = new SysDepartInfo(); record.Id = Convert.ToString(reader[ "Id" ]); record.ParentId = Convert.ToString(reader[ "ParentId" ]); record.Code = Convert.ToString(reader[ "Code" ]); record.Name = Convert.ToString(reader[ "Name" ]); eplist.Add(record); }); return eplist; } |
给EPList创建索引,并添加数据
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
|
/// <summary> /// 获取子节点 /// </summary> /// <param name="data"></param> /// <param name="parentId"></param> private IEnumerable<TreeInfo> CreateChildren(EPList<SysDepartInfo> data, TreeInfo node) { string id = node == null ? "0" : node.id; List<TreeInfo> childNodes = new List<TreeInfo>(); // ParentId字段上创建了索引,所以这里就可以通过索引值直接取出下一层子节点数据,避免Linq查询引发的效率问题 var indexValues = new string [] { "ParentId:" + id }; var childData = data[indexValues]; childData.ForEach(record => { var childNode = new TreeInfo { id = record.Id, text = record.Code + " " + record.Name }; childNodes.Add(childNode); childNode.children = CreateChildren(data, childNode); }); return childNodes.OrderBy(record => record.text); } 通过索引高效查询数据 |
以上就是小编整理的全部相关知识点内容,感谢大家的学习和对服务器之家的支持。
原文链接:https://www.cnblogs.com/MatureMan/p/12303347.html