1
- namespace GameFrameX . Utility . Extensions ;
2
-
3
- /// <summary>
4
- /// </summary>
5
- public static class CollectionExtensions
6
- {
7
- #region ICollectionExtensions
8
-
9
- /// <summary>
10
- /// 检查集合是否为 null 或空。
11
- /// </summary>
12
- /// <typeparam name="T">集合元素的类型。</typeparam>
13
- /// <param name="self">要检查的集合。</param>
14
- /// <returns>如果集合为 null 或空,则为 true;否则为 false。</returns>
15
- public static bool IsNullOrEmpty < T > ( this ICollection < T > self )
16
- {
17
- return self == null || self . Count <= 0 ;
18
- }
19
-
20
- #endregion
21
-
22
- /// <summary>
23
- /// 将一个可枚举集合的元素添加到哈希集合中。
24
- /// </summary>
25
- /// <typeparam name="T">哈希集合元素的类型。</typeparam>
26
- /// <param name="c">要添加元素的哈希集合。</param>
27
- /// <param name="e">要添加的元素的可枚举集合。</param>
28
- public static void AddRange < T > ( this HashSet < T > c , IEnumerable < T > e )
29
- {
30
- foreach ( var item in e )
31
- {
32
- c . Add ( item ) ;
33
- }
34
- }
35
-
36
- #region DictionaryExtensions
37
-
38
- /// <summary>
39
- /// 合并字典中的键值对。如果字典中已存在指定的键,则使用指定的函数对原有值和新值进行合并;否则直接添加键值对。
40
- /// </summary>
41
- /// <typeparam name="TKey">键的类型。</typeparam>
42
- /// <typeparam name="TValue">值的类型。</typeparam>
43
- /// <param name="self">要合并的字典。</param>
44
- /// <param name="k">要添加或合并的键。</param>
45
- /// <param name="v">要添加或合并的值。</param>
46
- /// <param name="func">用于合并值的函数。</param>
47
- public static void Merge < TKey , TValue > ( this Dictionary < TKey , TValue > self , TKey k , TValue v , Func < TValue , TValue , TValue > func )
48
- {
49
- self [ k ] = self . TryGetValue ( k , out var value ) ? func ( value , v ) : v ;
50
- }
51
-
52
- /// <summary>
53
- /// 获取指定键的值,如果字典中不存在该键,则使用指定的函数获取值并添加到字典中。
54
- /// </summary>
55
- /// <typeparam name="TKey">键的类型。</typeparam>
56
- /// <typeparam name="TValue">值的类型。</typeparam>
57
- /// <param name="self">要操作的字典。</param>
58
- /// <param name="key">要获取值的键。</param>
59
- /// <param name="valueGetter">用于获取值的函数。</param>
60
- /// <returns>指定键的值。</returns>
61
- public static TValue GetOrAdd < TKey , TValue > ( this Dictionary < TKey , TValue > self , TKey key , Func < TKey , TValue > valueGetter )
62
- {
63
- if ( ! self . TryGetValue ( key , out var value ) )
64
- {
65
- value = valueGetter ( key ) ;
66
- self [ key ] = value ;
67
- }
68
-
69
- return value ;
70
- }
71
-
72
- /// <summary>
73
- /// 获取指定键的值,如果字典中不存在该键,则使用无参构造函数创建一个新的值并添加到字典中。
74
- /// </summary>
75
- /// <typeparam name="TKey">键的类型。</typeparam>
76
- /// <typeparam name="TValue">值的类型。</typeparam>
77
- /// <param name="self">要操作的字典。</param>
78
- /// <param name="key">要获取值的键。</param>
79
- /// <returns>指定键的值。</returns>
80
- public static TValue GetOrAdd < TKey , TValue > ( this Dictionary < TKey , TValue > self , TKey key ) where TValue : new ( )
81
- {
82
- return GetOrAdd ( self , key , _ => new TValue ( ) ) ;
83
- }
84
-
85
- /// <summary>
86
- /// 根据指定条件从字典中移除键值对。
87
- /// </summary>
88
- /// <typeparam name="TKey">键的类型。</typeparam>
89
- /// <typeparam name="TValue">值的类型。</typeparam>
90
- /// <param name="self">要操作的字典。</param>
91
- /// <param name="predict">判断是否移除键值对的条件。</param>
92
- /// <returns>移除的键值对数量。</returns>
93
- public static int RemoveIf < TKey , TValue > ( this Dictionary < TKey , TValue > self , Func < TKey , TValue , bool > predict )
94
- {
95
- var count = 0 ;
96
- foreach ( var kv in self )
97
- {
98
- if ( predict ( kv . Key , kv . Value ) )
99
- {
100
- self . Remove ( kv . Key ) ;
101
- count ++ ;
102
- }
103
- }
104
-
105
- return count ;
106
- }
107
-
108
- #endregion
109
-
110
- #region List<T>
111
-
112
- /// <summary>
113
- /// 从列表中随机获取一个对象。
114
- /// </summary>
115
- /// <typeparam name="T">列表元素的类型。</typeparam>
116
- /// <param name="list">要随机的列表。</param>
117
- public static T Random < T > ( this List < T > list )
118
- {
119
- var n = list . Count ;
120
- var r = ThreadLocalRandom . Current ;
121
- var index = r . Next ( n ) ;
122
- return list [ index ] ;
123
- }
124
-
125
- /// <summary>
126
- /// 打乱列表中的元素顺序。
127
- /// </summary>
128
- /// <typeparam name="T">列表元素的类型。</typeparam>
129
- /// <param name="list">要打乱顺序的列表。</param>
130
- public static void Shuffer < T > ( this List < T > list )
131
- {
132
- var n = list . Count ;
133
- var r = ThreadLocalRandom . Current ;
134
- for ( var i = 0 ; i < n ; i ++ )
135
- {
136
- var rand = r . Next ( i , n ) ;
137
- ( list [ i ] , list [ rand ] ) = ( list [ rand ] , list [ i ] ) ;
138
- }
139
- }
140
-
141
- /// <summary>
142
- /// 从列表中移除满足条件的元素。
143
- /// </summary>
144
- /// <typeparam name="T">列表元素的类型。</typeparam>
145
- /// <param name="list">要操作的列表。</param>
146
- /// <param name="condition">用于判断元素是否满足移除条件的委托。</param>
147
- public static void RemoveIf < T > ( this List < T > list , Predicate < T > condition )
148
- {
149
- var idx = list . FindIndex ( condition ) ;
150
- while ( idx >= 0 )
151
- {
152
- list . RemoveAt ( idx ) ;
153
- idx = list . FindIndex ( condition ) ;
154
- }
155
- }
156
-
157
- #endregion
1
+ namespace GameFrameX . Utility . Extensions ;
2
+
3
+ /// <summary>
4
+ /// </summary>
5
+ public static class CollectionExtensions
6
+ {
7
+ #region ICollectionExtensions
8
+
9
+ /// <summary>
10
+ /// 检查集合是否为 null 或空。
11
+ /// </summary>
12
+ /// <typeparam name="T">集合元素的类型。</typeparam>
13
+ /// <param name="self">要检查的集合。</param>
14
+ /// <returns>如果集合为 null 或空,则为 true;否则为 false。</returns>
15
+ public static bool IsNullOrEmpty < T > ( this ICollection < T > self )
16
+ {
17
+ return self == null || self . Count <= 0 ;
18
+ }
19
+
20
+ #endregion
21
+
22
+ /// <summary>
23
+ /// 将一个可枚举集合的元素添加到哈希集合中。
24
+ /// </summary>
25
+ /// <typeparam name="T">哈希集合元素的类型。</typeparam>
26
+ /// <param name="c">要添加元素的哈希集合。</param>
27
+ /// <param name="e">要添加的元素的可枚举集合。</param>
28
+ public static void AddRange < T > ( this HashSet < T > c , IEnumerable < T > e )
29
+ {
30
+ foreach ( var item in e )
31
+ {
32
+ c . Add ( item ) ;
33
+ }
34
+ }
35
+
36
+ #region DictionaryExtensions
37
+
38
+ /// <summary>
39
+ /// 合并字典中的键值对。如果字典中已存在指定的键,则使用指定的函数对原有值和新值进行合并;否则直接添加键值对。
40
+ /// </summary>
41
+ /// <typeparam name="TKey">键的类型。</typeparam>
42
+ /// <typeparam name="TValue">值的类型。</typeparam>
43
+ /// <param name="self">要合并的字典。</param>
44
+ /// <param name="k">要添加或合并的键。</param>
45
+ /// <param name="v">要添加或合并的值。</param>
46
+ /// <param name="func">用于合并值的函数。</param>
47
+ public static void Merge < TKey , TValue > ( this Dictionary < TKey , TValue > self , TKey k , TValue v , Func < TValue , TValue , TValue > func )
48
+ {
49
+ self [ k ] = self . TryGetValue ( k , out var value ) ? func ( value , v ) : v ;
50
+ }
51
+
52
+ /// <summary>
53
+ /// 获取指定键的值,如果字典中不存在该键,则使用指定的函数获取值并添加到字典中。
54
+ /// </summary>
55
+ /// <typeparam name="TKey">键的类型。</typeparam>
56
+ /// <typeparam name="TValue">值的类型。</typeparam>
57
+ /// <param name="self">要操作的字典。</param>
58
+ /// <param name="key">要获取值的键。</param>
59
+ /// <param name="valueGetter">用于获取值的函数。</param>
60
+ /// <returns>指定键的值。</returns>
61
+ public static TValue GetOrAdd < TKey , TValue > ( this Dictionary < TKey , TValue > self , TKey key , Func < TKey , TValue > valueGetter )
62
+ {
63
+ if ( ! self . TryGetValue ( key , out var value ) )
64
+ {
65
+ value = valueGetter ( key ) ;
66
+ self [ key ] = value ;
67
+ }
68
+
69
+ return value ;
70
+ }
71
+
72
+ /// <summary>
73
+ /// 获取指定键的值,如果字典中不存在该键,则使用无参构造函数创建一个新的值并添加到字典中。
74
+ /// </summary>
75
+ /// <typeparam name="TKey">键的类型。</typeparam>
76
+ /// <typeparam name="TValue">值的类型。</typeparam>
77
+ /// <param name="self">要操作的字典。</param>
78
+ /// <param name="key">要获取值的键。</param>
79
+ /// <returns>指定键的值。</returns>
80
+ public static TValue GetOrAdd < TKey , TValue > ( this Dictionary < TKey , TValue > self , TKey key ) where TValue : new ( )
81
+ {
82
+ return GetOrAdd ( self , key , _ => new TValue ( ) ) ;
83
+ }
84
+
85
+ /// <summary>
86
+ /// 根据指定条件从字典中移除键值对。
87
+ /// </summary>
88
+ /// <typeparam name="TKey">键的类型。</typeparam>
89
+ /// <typeparam name="TValue">值的类型。</typeparam>
90
+ /// <param name="self">要操作的字典。</param>
91
+ /// <param name="predict">判断是否移除键值对的条件。</param>
92
+ /// <returns>移除的键值对数量。</returns>
93
+ public static int RemoveIf < TKey , TValue > ( this Dictionary < TKey , TValue > self , Func < TKey , TValue , bool > predict )
94
+ {
95
+ var count = 0 ;
96
+ foreach ( var kv in self )
97
+ {
98
+ if ( predict ( kv . Key , kv . Value ) )
99
+ {
100
+ self . Remove ( kv . Key ) ;
101
+ count ++ ;
102
+ }
103
+ }
104
+
105
+ return count ;
106
+ }
107
+
108
+ #endregion
109
+
110
+ #region List<T>
111
+
112
+ /// <summary>
113
+ /// 从列表中随机获取一个对象。
114
+ /// </summary>
115
+ /// <typeparam name="T">列表元素的类型。</typeparam>
116
+ /// <param name="list">要随机的列表。</param>
117
+ public static T Random < T > ( this List < T > list )
118
+ {
119
+ var n = list . Count ;
120
+ var index = Utility . RandomHelper . Next ( n ) ;
121
+ return list [ index ] ;
122
+ }
123
+
124
+ /// <summary>
125
+ /// 打乱列表中的元素顺序。
126
+ /// </summary>
127
+ /// <typeparam name="T">列表元素的类型。</typeparam>
128
+ /// <param name="list">要打乱顺序的列表。</param>
129
+ public static void Shuffer < T > ( this List < T > list )
130
+ {
131
+ var n = list . Count ;
132
+ for ( var i = 0 ; i < n ; i ++ )
133
+ {
134
+ var rand = Utility . RandomHelper . Next ( i , n ) ;
135
+ ( list [ i ] , list [ rand ] ) = ( list [ rand ] , list [ i ] ) ;
136
+ }
137
+ }
138
+
139
+ /// <summary>
140
+ /// 从列表中移除满足条件的元素。
141
+ /// </summary>
142
+ /// <typeparam name="T">列表元素的类型。</typeparam>
143
+ /// <param name="list">要操作的列表。</param>
144
+ /// <param name="condition">用于判断元素是否满足移除条件的委托。</param>
145
+ public static void RemoveIf < T > ( this List < T > list , Predicate < T > condition )
146
+ {
147
+ var idx = list . FindIndex ( condition ) ;
148
+ while ( idx >= 0 )
149
+ {
150
+ list . RemoveAt ( idx ) ;
151
+ idx = list . FindIndex ( condition ) ;
152
+ }
153
+ }
154
+
155
+ #endregion
158
156
}
0 commit comments