IDictionaryExtensions.cs 44 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155
  1. using Masuit.Tools.Systems;
  2. using System;
  3. using System.Collections.Concurrent;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Threading.Tasks;
  7. namespace Masuit.Tools;
  8. public static class IDictionaryExtensions
  9. {
  10. /// <summary>
  11. /// 添加或更新键值对
  12. /// </summary>
  13. /// <param name="this"></param>
  14. /// <param name="that">另一个字典集</param>
  15. public static void AddOrUpdate<TKey, TValue>(this IDictionary<TKey, TValue> @this, IDictionary<TKey, TValue> that)
  16. {
  17. foreach (var item in that)
  18. {
  19. @this[item.Key] = item.Value;
  20. }
  21. }
  22. /// <summary>
  23. /// 添加或更新键值对
  24. /// </summary>
  25. /// <param name="this"></param>
  26. /// <param name="that">另一个字典集</param>
  27. public static void AddOrUpdate<TKey, TValue>(this NullableDictionary<TKey, TValue> @this, IDictionary<TKey, TValue> that)
  28. {
  29. foreach (var item in that)
  30. {
  31. @this[item.Key] = item.Value;
  32. }
  33. }
  34. /// <summary>
  35. /// 添加或更新键值对
  36. /// </summary>
  37. /// <param name="this"></param>
  38. /// <param name="that">另一个字典集</param>
  39. public static void AddOrUpdate<TKey, TValue>(this NullableConcurrentDictionary<TKey, TValue> @this, IDictionary<TKey, TValue> that)
  40. {
  41. foreach (var item in that)
  42. {
  43. @this[item.Key] = item.Value;
  44. }
  45. }
  46. /// <summary>
  47. /// 添加或更新键值对
  48. /// </summary>
  49. /// <param name="this"></param>
  50. /// <param name="that">另一个字典集</param>
  51. public static void AddOrUpdateTo<TKey, TValue>(this IDictionary<TKey, TValue> @this, IDictionary<TKey, TValue> that)
  52. {
  53. foreach (var item in @this)
  54. {
  55. that[item.Key] = item.Value;
  56. }
  57. }
  58. /// <summary>
  59. /// 添加或更新键值对
  60. /// </summary>
  61. /// <param name="this"></param>
  62. /// <param name="that">另一个字典集</param>
  63. public static void AddOrUpdateTo<TKey, TValue>(this NullableDictionary<TKey, TValue> @this, IDictionary<TKey, TValue> that)
  64. {
  65. foreach (var item in @this)
  66. {
  67. that[item.Key] = item.Value;
  68. }
  69. }
  70. /// <summary>
  71. /// 添加或更新键值对
  72. /// </summary>
  73. /// <param name="this"></param>
  74. /// <param name="that">另一个字典集</param>
  75. public static void AddOrUpdateTo<TKey, TValue>(this NullableConcurrentDictionary<TKey, TValue> @this, IDictionary<TKey, TValue> that)
  76. {
  77. foreach (var item in @this)
  78. {
  79. that[item.Key] = item.Value;
  80. }
  81. }
  82. /// <summary>
  83. /// 添加或更新键值对
  84. /// </summary>
  85. /// <param name="this"></param>
  86. /// <param name="key">键</param>
  87. /// <param name="addValue">添加时的值</param>
  88. /// <param name="updateValueFactory">更新时的操作</param>
  89. public static TValue AddOrUpdate<TKey, TValue>(this IDictionary<TKey, TValue> @this, TKey key, TValue addValue, Func<TKey, TValue, TValue> updateValueFactory)
  90. {
  91. if ([email protected](key, addValue))
  92. {
  93. @this[key] = updateValueFactory(key, @this[key]);
  94. }
  95. return @this[key];
  96. }
  97. /// <summary>
  98. /// 添加或更新键值对
  99. /// </summary>
  100. /// <param name="this"></param>
  101. /// <param name="key">键</param>
  102. /// <param name="addValue">添加时的值</param>
  103. /// <param name="updateValueFactory">更新时的操作</param>
  104. public static TValue AddOrUpdate<TKey, TValue>(this NullableDictionary<TKey, TValue> @this, TKey key, TValue addValue, Func<TKey, TValue, TValue> updateValueFactory)
  105. {
  106. if ([email protected](key, addValue))
  107. {
  108. @this[key] = updateValueFactory(key, @this[key]);
  109. }
  110. return @this[key];
  111. }
  112. /// <summary>
  113. /// 添加或更新键值对
  114. /// </summary>
  115. /// <typeparam name="TKey"></typeparam>
  116. /// <typeparam name="TValue"></typeparam>
  117. /// <param name="this"></param>
  118. /// <param name="key">键</param>
  119. /// <param name="addValue">添加时的值</param>
  120. /// <param name="updateValueFactory">更新时的操作</param>
  121. public static TValue AddOrUpdate<TKey, TValue>(this NullableConcurrentDictionary<TKey, TValue> @this, TKey key, TValue addValue, Func<TKey, TValue, TValue> updateValueFactory)
  122. {
  123. if ([email protected](key, addValue))
  124. {
  125. @this[key] = updateValueFactory(key, @this[key]);
  126. }
  127. return @this[key];
  128. }
  129. /// <summary>
  130. /// 添加或更新键值对
  131. /// </summary>
  132. /// <typeparam name="TKey"></typeparam>
  133. /// <typeparam name="TValue"></typeparam>
  134. /// <param name="this"></param>
  135. /// <param name="key">键</param>
  136. /// <param name="addValue">添加时的值</param>
  137. /// <param name="updateValueFactory">更新时的操作</param>
  138. public static async Task<TValue> AddOrUpdateAsync<TKey, TValue>(this IDictionary<TKey, TValue> @this, TKey key, TValue addValue, Func<TKey, TValue, Task<TValue>> updateValueFactory)
  139. {
  140. if ([email protected](key, addValue))
  141. {
  142. @this[key] = await updateValueFactory(key, @this[key]);
  143. }
  144. return @this[key];
  145. }
  146. /// <summary>
  147. /// 添加或更新键值对
  148. /// </summary>
  149. /// <typeparam name="TKey"></typeparam>
  150. /// <typeparam name="TValue"></typeparam>
  151. /// <param name="this"></param>
  152. /// <param name="key">键</param>
  153. /// <param name="addValue">添加时的值</param>
  154. /// <param name="updateValueFactory">更新时的操作</param>
  155. public static async Task<TValue> AddOrUpdateAsync<TKey, TValue>(this NullableDictionary<TKey, TValue> @this, TKey key, TValue addValue, Func<TKey, TValue, Task<TValue>> updateValueFactory)
  156. {
  157. if ([email protected](key, addValue))
  158. {
  159. @this[key] = await updateValueFactory(key, @this[key]);
  160. }
  161. return @this[key];
  162. }
  163. /// <summary>
  164. /// 添加或更新键值对
  165. /// </summary>
  166. /// <typeparam name="TKey"></typeparam>
  167. /// <typeparam name="TValue"></typeparam>
  168. /// <param name="this"></param>
  169. /// <param name="key">键</param>
  170. /// <param name="addValue">添加时的值</param>
  171. /// <param name="updateValueFactory">更新时的操作</param>
  172. public static async Task<TValue> AddOrUpdateAsync<TKey, TValue>(this NullableConcurrentDictionary<TKey, TValue> @this, TKey key, TValue addValue, Func<TKey, TValue, Task<TValue>> updateValueFactory)
  173. {
  174. if ([email protected](key, addValue))
  175. {
  176. @this[key] = await updateValueFactory(key, @this[key]);
  177. }
  178. return @this[key];
  179. }
  180. /// <summary>
  181. /// 添加或更新键值对
  182. /// </summary>
  183. /// <typeparam name="TKey"></typeparam>
  184. /// <typeparam name="TValue"></typeparam>
  185. /// <param name="this"></param>
  186. /// <param name="key">键</param>
  187. /// <param name="addValue">添加时的值</param>
  188. /// <param name="updateValue">更新时的值</param>
  189. public static TValue AddOrUpdate<TKey, TValue>(this IDictionary<TKey, TValue> @this, TKey key, TValue addValue, TValue updateValue)
  190. {
  191. if ([email protected](key, addValue))
  192. {
  193. @this[key] = updateValue;
  194. }
  195. return @this[key];
  196. }
  197. /// <summary>
  198. /// 添加或更新键值对
  199. /// </summary>
  200. /// <param name="this"></param>
  201. /// <param name="key">键</param>
  202. /// <param name="addValue">添加时的值</param>
  203. /// <param name="updateValue">更新时的值</param>
  204. public static TValue AddOrUpdate<TKey, TValue>(this NullableDictionary<TKey, TValue> @this, TKey key, TValue addValue, TValue updateValue)
  205. {
  206. if ([email protected](key, addValue))
  207. {
  208. @this[key] = updateValue;
  209. }
  210. return @this[key];
  211. }
  212. /// <summary>
  213. /// 添加或更新键值对
  214. /// </summary>
  215. /// <typeparam name="TKey"></typeparam>
  216. /// <typeparam name="TValue"></typeparam>
  217. /// <param name="this"></param>
  218. /// <param name="key">键</param>
  219. /// <param name="addValue">添加时的值</param>
  220. /// <param name="updateValue">更新时的值</param>
  221. public static TValue AddOrUpdate<TKey, TValue>(this NullableConcurrentDictionary<TKey, TValue> @this, TKey key, TValue addValue, TValue updateValue)
  222. {
  223. if ([email protected](key, addValue))
  224. {
  225. @this[key] = updateValue;
  226. }
  227. return @this[key];
  228. }
  229. /// <summary>
  230. /// 添加或更新键值对
  231. /// </summary>
  232. /// <typeparam name="TKey"></typeparam>
  233. /// <typeparam name="TValue"></typeparam>
  234. /// <param name="this"></param>
  235. /// <param name="that">另一个字典集</param>
  236. /// <param name="updateValueFactory">更新时的操作</param>
  237. public static void AddOrUpdate<TKey, TValue>(this IDictionary<TKey, TValue> @this, IDictionary<TKey, TValue> that, Func<TKey, TValue, TValue> updateValueFactory)
  238. {
  239. foreach (var item in that)
  240. {
  241. AddOrUpdate(@this, item.Key, item.Value, updateValueFactory);
  242. }
  243. }
  244. /// <summary>
  245. /// 添加或更新键值对
  246. /// </summary>
  247. /// <typeparam name="TKey"></typeparam>
  248. /// <typeparam name="TValue"></typeparam>
  249. /// <param name="this"></param>
  250. /// <param name="that">另一个字典集</param>
  251. /// <param name="updateValueFactory">更新时的操作</param>
  252. public static void AddOrUpdate<TKey, TValue>(this NullableDictionary<TKey, TValue> @this, IDictionary<TKey, TValue> that, Func<TKey, TValue, TValue> updateValueFactory)
  253. {
  254. foreach (var item in that)
  255. {
  256. AddOrUpdate(@this, item.Key, item.Value, updateValueFactory);
  257. }
  258. }
  259. /// <summary>
  260. /// 添加或更新键值对
  261. /// </summary>
  262. /// <typeparam name="TKey"></typeparam>
  263. /// <typeparam name="TValue"></typeparam>
  264. /// <param name="this"></param>
  265. /// <param name="that">另一个字典集</param>
  266. /// <param name="updateValueFactory">更新时的操作</param>
  267. public static void AddOrUpdate<TKey, TValue>(this NullableConcurrentDictionary<TKey, TValue> @this, IDictionary<TKey, TValue> that, Func<TKey, TValue, TValue> updateValueFactory)
  268. {
  269. foreach (var item in that)
  270. {
  271. AddOrUpdate(@this, item.Key, item.Value, updateValueFactory);
  272. }
  273. }
  274. /// <summary>
  275. /// 添加或更新键值对
  276. /// </summary>
  277. /// <typeparam name="TKey"></typeparam>
  278. /// <typeparam name="TValue"></typeparam>
  279. /// <param name="this"></param>
  280. /// <param name="that">另一个字典集</param>
  281. /// <param name="updateValueFactory">更新时的操作</param>
  282. public static Task AddOrUpdateAsync<TKey, TValue>(this IDictionary<TKey, TValue> @this, IDictionary<TKey, TValue> that, Func<TKey, TValue, Task<TValue>> updateValueFactory)
  283. {
  284. return that.ForeachAsync(item => AddOrUpdateAsync(@this, item.Key, item.Value, updateValueFactory));
  285. }
  286. /// <summary>
  287. /// 添加或更新键值对
  288. /// </summary>
  289. /// <typeparam name="TKey"></typeparam>
  290. /// <typeparam name="TValue"></typeparam>
  291. /// <param name="this"></param>
  292. /// <param name="that">另一个字典集</param>
  293. /// <param name="updateValueFactory">更新时的操作</param>
  294. public static Task AddOrUpdateAsync<TKey, TValue>(this NullableDictionary<TKey, TValue> @this, IDictionary<TKey, TValue> that, Func<TKey, TValue, Task<TValue>> updateValueFactory)
  295. {
  296. return that.ForeachAsync(item => AddOrUpdateAsync(@this, item.Key, item.Value, updateValueFactory));
  297. }
  298. /// <summary>
  299. /// 添加或更新键值对
  300. /// </summary>
  301. /// <typeparam name="TKey"></typeparam>
  302. /// <typeparam name="TValue"></typeparam>
  303. /// <param name="this"></param>
  304. /// <param name="that">另一个字典集</param>
  305. /// <param name="updateValueFactory">更新时的操作</param>
  306. public static Task AddOrUpdateAsync<TKey, TValue>(this NullableConcurrentDictionary<TKey, TValue> @this, IDictionary<TKey, TValue> that, Func<TKey, TValue, Task<TValue>> updateValueFactory)
  307. {
  308. return that.ForeachAsync(item => AddOrUpdateAsync(@this, item.Key, item.Value, updateValueFactory));
  309. }
  310. /// <summary>
  311. /// 添加或更新键值对
  312. /// </summary>
  313. /// <typeparam name="TKey"></typeparam>
  314. /// <typeparam name="TValue"></typeparam>
  315. /// <param name="this"></param>
  316. /// <param name="that">另一个字典集</param>
  317. /// <param name="updateValueFactory">更新时的操作</param>
  318. public static void AddOrUpdateTo<TKey, TValue>(this IDictionary<TKey, TValue> @this, IDictionary<TKey, TValue> that, Func<TKey, TValue, TValue> updateValueFactory)
  319. {
  320. foreach (var item in @this)
  321. {
  322. AddOrUpdate(that, item.Key, item.Value, updateValueFactory);
  323. }
  324. }
  325. /// <summary>
  326. /// 添加或更新键值对
  327. /// </summary>
  328. /// <typeparam name="TKey"></typeparam>
  329. /// <typeparam name="TValue"></typeparam>
  330. /// <param name="this"></param>
  331. /// <param name="that">另一个字典集</param>
  332. /// <param name="updateValueFactory">更新时的操作</param>
  333. public static void AddOrUpdateTo<TKey, TValue>(this IDictionary<TKey, TValue> @this, NullableDictionary<TKey, TValue> that, Func<TKey, TValue, TValue> updateValueFactory)
  334. {
  335. foreach (var item in @this)
  336. {
  337. AddOrUpdate(that, item.Key, item.Value, updateValueFactory);
  338. }
  339. }
  340. /// <summary>
  341. /// 添加或更新键值对
  342. /// </summary>
  343. /// <typeparam name="TKey"></typeparam>
  344. /// <typeparam name="TValue"></typeparam>
  345. /// <param name="this"></param>
  346. /// <param name="that">另一个字典集</param>
  347. /// <param name="updateValueFactory">更新时的操作</param>
  348. public static void AddOrUpdateTo<TKey, TValue>(this IDictionary<TKey, TValue> @this, NullableConcurrentDictionary<TKey, TValue> that, Func<TKey, TValue, TValue> updateValueFactory)
  349. {
  350. foreach (var item in @this)
  351. {
  352. AddOrUpdate(that, item.Key, item.Value, updateValueFactory);
  353. }
  354. }
  355. /// <summary>
  356. /// 添加或更新键值对
  357. /// </summary>
  358. /// <typeparam name="TKey"></typeparam>
  359. /// <typeparam name="TValue"></typeparam>
  360. /// <param name="this"></param>
  361. /// <param name="that">另一个字典集</param>
  362. /// <param name="updateValueFactory">更新时的操作</param>
  363. public static Task AddOrUpdateAsyncTo<TKey, TValue>(this IDictionary<TKey, TValue> @this, IDictionary<TKey, TValue> that, Func<TKey, TValue, Task<TValue>> updateValueFactory)
  364. {
  365. return @this.ForeachAsync(item => AddOrUpdateAsync(that, item.Key, item.Value, updateValueFactory));
  366. }
  367. /// <summary>
  368. /// 添加或更新键值对
  369. /// </summary>
  370. /// <typeparam name="TKey"></typeparam>
  371. /// <typeparam name="TValue"></typeparam>
  372. /// <param name="this"></param>
  373. /// <param name="that">另一个字典集</param>
  374. /// <param name="updateValueFactory">更新时的操作</param>
  375. public static Task AddOrUpdateAsyncTo<TKey, TValue>(this IDictionary<TKey, TValue> @this, NullableDictionary<TKey, TValue> that, Func<TKey, TValue, Task<TValue>> updateValueFactory)
  376. {
  377. return @this.ForeachAsync(item => AddOrUpdateAsync(that, item.Key, item.Value, updateValueFactory));
  378. }
  379. /// <summary>
  380. /// 添加或更新键值对
  381. /// </summary>
  382. /// <typeparam name="TKey"></typeparam>
  383. /// <typeparam name="TValue"></typeparam>
  384. /// <param name="this"></param>
  385. /// <param name="that">另一个字典集</param>
  386. /// <param name="updateValueFactory">更新时的操作</param>
  387. public static Task AddOrUpdateAsyncTo<TKey, TValue>(this IDictionary<TKey, TValue> @this, NullableConcurrentDictionary<TKey, TValue> that, Func<TKey, TValue, Task<TValue>> updateValueFactory)
  388. {
  389. return @this.ForeachAsync(item => AddOrUpdateAsync(that, item.Key, item.Value, updateValueFactory));
  390. }
  391. /// <summary>
  392. /// 添加或更新键值对
  393. /// </summary>
  394. /// <typeparam name="TKey"></typeparam>
  395. /// <typeparam name="TValue"></typeparam>
  396. /// <param name="this"></param>
  397. /// <param name="key">键</param>
  398. /// <param name="addValueFactory">添加时的操作</param>
  399. /// <param name="updateValueFactory">更新时的操作</param>
  400. public static TValue AddOrUpdate<TKey, TValue>(this IDictionary<TKey, TValue> @this, TKey key, Func<TKey, TValue> addValueFactory, Func<TKey, TValue, TValue> updateValueFactory)
  401. {
  402. if ([email protected](key, addValueFactory(key)))
  403. {
  404. @this[key] = updateValueFactory(key, @this[key]);
  405. }
  406. return @this[key];
  407. }
  408. /// <summary>
  409. /// 添加或更新键值对
  410. /// </summary>
  411. /// <typeparam name="TKey"></typeparam>
  412. /// <typeparam name="TValue"></typeparam>
  413. /// <param name="this"></param>
  414. /// <param name="key">键</param>
  415. /// <param name="addValueFactory">添加时的操作</param>
  416. /// <param name="updateValueFactory">更新时的操作</param>
  417. public static TValue AddOrUpdate<TKey, TValue>(this NullableDictionary<TKey, TValue> @this, TKey key, Func<TKey, TValue> addValueFactory, Func<TKey, TValue, TValue> updateValueFactory)
  418. {
  419. if ([email protected](key, addValueFactory(key)))
  420. {
  421. @this[key] = updateValueFactory(key, @this[key]);
  422. }
  423. return @this[key];
  424. }
  425. /// <summary>
  426. /// 添加或更新键值对
  427. /// </summary>
  428. /// <typeparam name="TKey"></typeparam>
  429. /// <typeparam name="TValue"></typeparam>
  430. /// <param name="this"></param>
  431. /// <param name="key">键</param>
  432. /// <param name="addValueFactory">添加时的操作</param>
  433. /// <param name="updateValueFactory">更新时的操作</param>
  434. public static TValue AddOrUpdate<TKey, TValue>(this NullableConcurrentDictionary<TKey, TValue> @this, TKey key, Func<TKey, TValue> addValueFactory, Func<TKey, TValue, TValue> updateValueFactory)
  435. {
  436. if ([email protected](key, addValueFactory(key)))
  437. {
  438. @this[key] = updateValueFactory(key, @this[key]);
  439. }
  440. return @this[key];
  441. }
  442. /// <summary>
  443. /// 添加或更新键值对
  444. /// </summary>
  445. /// <typeparam name="TKey"></typeparam>
  446. /// <typeparam name="TValue"></typeparam>
  447. /// <param name="this"></param>
  448. /// <param name="key">键</param>
  449. /// <param name="addValueFactory">添加时的操作</param>
  450. /// <param name="updateValueFactory">更新时的操作</param>
  451. public static async Task<TValue> AddOrUpdateAsync<TKey, TValue>(this IDictionary<TKey, TValue> @this, TKey key, Func<TKey, Task<TValue>> addValueFactory, Func<TKey, TValue, Task<TValue>> updateValueFactory)
  452. {
  453. if ([email protected](key, await addValueFactory(key)))
  454. {
  455. @this[key] = await updateValueFactory(key, @this[key]);
  456. }
  457. return @this[key];
  458. }
  459. /// <summary>
  460. /// 添加或更新键值对
  461. /// </summary>
  462. /// <typeparam name="TKey"></typeparam>
  463. /// <typeparam name="TValue"></typeparam>
  464. /// <param name="this"></param>
  465. /// <param name="key">键</param>
  466. /// <param name="addValueFactory">添加时的操作</param>
  467. /// <param name="updateValueFactory">更新时的操作</param>
  468. public static async Task<TValue> AddOrUpdateAsync<TKey, TValue>(this NullableDictionary<TKey, TValue> @this, TKey key, Func<TKey, Task<TValue>> addValueFactory, Func<TKey, TValue, Task<TValue>> updateValueFactory)
  469. {
  470. if ([email protected](key, await addValueFactory(key)))
  471. {
  472. @this[key] = await updateValueFactory(key, @this[key]);
  473. }
  474. return @this[key];
  475. }
  476. /// <summary>
  477. /// 添加或更新键值对
  478. /// </summary>
  479. /// <typeparam name="TKey"></typeparam>
  480. /// <typeparam name="TValue"></typeparam>
  481. /// <param name="this"></param>
  482. /// <param name="key">键</param>
  483. /// <param name="addValueFactory">添加时的操作</param>
  484. /// <param name="updateValueFactory">更新时的操作</param>
  485. public static async Task<TValue> AddOrUpdateAsync<TKey, TValue>(this NullableConcurrentDictionary<TKey, TValue> @this, TKey key, Func<TKey, Task<TValue>> addValueFactory, Func<TKey, TValue, Task<TValue>> updateValueFactory)
  486. {
  487. if ([email protected](key, await addValueFactory(key)))
  488. {
  489. @this[key] = await updateValueFactory(key, @this[key]);
  490. }
  491. return @this[key];
  492. }
  493. /// <summary>
  494. /// 获取或添加
  495. /// </summary>
  496. /// <typeparam name="TKey"></typeparam>
  497. /// <typeparam name="TValue"></typeparam>
  498. /// <param name="this"></param>
  499. /// <param name="key"></param>
  500. /// <param name="addValueFactory"></param>
  501. public static TValue GetOrAdd<TKey, TValue>(this IDictionary<TKey, TValue> @this, TKey key, Func<TValue> addValueFactory)
  502. {
  503. if ([email protected](key))
  504. {
  505. @this[key] = addValueFactory();
  506. }
  507. return @this[key];
  508. }
  509. /// <summary>
  510. /// 获取或添加
  511. /// </summary>
  512. /// <typeparam name="TKey"></typeparam>
  513. /// <typeparam name="TValue"></typeparam>
  514. /// <param name="this"></param>
  515. /// <param name="key"></param>
  516. /// <param name="addValueFactory"></param>
  517. public static async Task<TValue> GetOrAddAsync<TKey, TValue>(this IDictionary<TKey, TValue> @this, TKey key, Func<Task<TValue>> addValueFactory)
  518. {
  519. if ([email protected](key))
  520. {
  521. @this[key] = await addValueFactory();
  522. }
  523. return @this[key];
  524. }
  525. /// <summary>
  526. /// 获取或添加
  527. /// </summary>
  528. /// <typeparam name="TKey"></typeparam>
  529. /// <typeparam name="TValue"></typeparam>
  530. /// <param name="this"></param>
  531. /// <param name="key"></param>
  532. /// <param name="addValue"></param>
  533. public static TValue GetOrAdd<TKey, TValue>(this Dictionary<TKey, TValue> @this, TKey key, TValue addValue)
  534. {
  535. return @this.TryAdd(key, addValue) ? addValue : @this[key];
  536. }
  537. #if NETSTANDARD2_1_OR_GREATER
  538. #else
  539. public static bool TryAdd<TKey, TValue>(this IDictionary<TKey, TValue> dictionary, TKey key, TValue value) where TKey : notnull
  540. {
  541. if (dictionary == null)
  542. throw new ArgumentNullException(nameof(dictionary));
  543. if (dictionary.IsReadOnly || dictionary.ContainsKey(key))
  544. return false;
  545. dictionary.Add(key, value);
  546. return true;
  547. }
  548. #endif
  549. /// <summary>
  550. /// 遍历IEnumerable
  551. /// </summary>
  552. /// <param name="dic"></param>
  553. /// <param name="action">回调方法</param>
  554. public static void ForEach<TKey, TValue>(this IDictionary<TKey, TValue> dic, Action<TKey, TValue> action)
  555. {
  556. foreach (var item in dic)
  557. {
  558. action(item.Key, item.Value);
  559. }
  560. }
  561. /// <summary>
  562. /// 遍历IDictionary
  563. /// </summary>
  564. /// <param name="dic"></param>
  565. /// <param name="action">回调方法</param>
  566. public static Task ForEachAsync<TKey, TValue>(this IDictionary<TKey, TValue> dic, Func<TKey, TValue, Task> action)
  567. {
  568. return dic.ForeachAsync(x => action(x.Key, x.Value));
  569. }
  570. /// <summary>
  571. /// 安全的转换成字典集
  572. /// </summary>
  573. /// <typeparam name="TSource"></typeparam>
  574. /// <typeparam name="TKey"></typeparam>
  575. /// <param name="source"></param>
  576. /// <param name="keySelector">键选择器</param>
  577. public static NullableDictionary<TKey, TSource> ToDictionarySafety<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
  578. {
  579. var items = source as IList<TSource> ?? source.ToList();
  580. var dic = new NullableDictionary<TKey, TSource>(items.Count);
  581. foreach (var item in items)
  582. {
  583. dic[keySelector(item)] = item;
  584. }
  585. return dic;
  586. }
  587. /// <summary>
  588. /// 安全的转换成字典集
  589. /// </summary>
  590. /// <typeparam name="TSource"></typeparam>
  591. /// <typeparam name="TKey"></typeparam>
  592. /// <param name="source"></param>
  593. /// <param name="keySelector">键选择器</param>
  594. /// <param name="defaultValue">键未找到时的默认值</param>
  595. public static NullableDictionary<TKey, TSource> ToDictionarySafety<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, TSource defaultValue)
  596. {
  597. var items = source as IList<TSource> ?? source.ToList();
  598. var dic = new NullableDictionary<TKey, TSource>(items.Count)
  599. {
  600. FallbackValue = defaultValue
  601. };
  602. foreach (var item in items)
  603. {
  604. dic[keySelector(item)] = item;
  605. }
  606. return dic;
  607. }
  608. /// <summary>
  609. /// 安全的转换成字典集
  610. /// </summary>
  611. /// <typeparam name="TSource"></typeparam>
  612. /// <typeparam name="TKey"></typeparam>
  613. /// <typeparam name="TElement"></typeparam>
  614. /// <param name="source"></param>
  615. /// <param name="keySelector">键选择器</param>
  616. /// <param name="elementSelector">值选择器</param>
  617. public static NullableDictionary<TKey, TElement> ToDictionarySafety<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector)
  618. {
  619. var items = source as IList<TSource> ?? source.ToList();
  620. var dic = new NullableDictionary<TKey, TElement>(items.Count);
  621. foreach (var item in items)
  622. {
  623. dic[keySelector(item)] = elementSelector(item);
  624. }
  625. return dic;
  626. }
  627. /// <summary>
  628. /// 安全的转换成字典集
  629. /// </summary>
  630. /// <typeparam name="TSource"></typeparam>
  631. /// <typeparam name="TKey"></typeparam>
  632. /// <typeparam name="TElement"></typeparam>
  633. /// <param name="source"></param>
  634. /// <param name="keySelector">键选择器</param>
  635. /// <param name="elementSelector">值选择器</param>
  636. /// <param name="defaultValue">键未找到时的默认值</param>
  637. public static NullableDictionary<TKey, TElement> ToDictionarySafety<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, TElement defaultValue)
  638. {
  639. var items = source as IList<TSource> ?? source.ToList();
  640. var dic = new NullableDictionary<TKey, TElement>(items.Count)
  641. {
  642. FallbackValue = defaultValue
  643. };
  644. foreach (var item in items)
  645. {
  646. dic[keySelector(item)] = elementSelector(item);
  647. }
  648. return dic;
  649. }
  650. /// <summary>
  651. /// 安全的转换成字典集
  652. /// </summary>
  653. /// <typeparam name="TSource"></typeparam>
  654. /// <typeparam name="TKey"></typeparam>
  655. /// <typeparam name="TElement"></typeparam>
  656. /// <param name="source"></param>
  657. /// <param name="keySelector">键选择器</param>
  658. /// <param name="elementSelector">值选择器</param>
  659. public static async Task<NullableDictionary<TKey, TElement>> ToDictionarySafetyAsync<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, Task<TElement>> elementSelector)
  660. {
  661. var items = source as IList<TSource> ?? source.ToList();
  662. var dic = new NullableDictionary<TKey, TElement>(items.Count);
  663. await items.ForeachAsync(async item => dic[keySelector(item)] = await elementSelector(item));
  664. return dic;
  665. }
  666. /// <summary>
  667. /// 安全的转换成字典集
  668. /// </summary>
  669. /// <typeparam name="TSource"></typeparam>
  670. /// <typeparam name="TKey"></typeparam>
  671. /// <typeparam name="TElement"></typeparam>
  672. /// <param name="source"></param>
  673. /// <param name="keySelector">键选择器</param>
  674. /// <param name="elementSelector">值选择器</param>
  675. /// <param name="defaultValue">键未找到时的默认值</param>
  676. public static async Task<NullableDictionary<TKey, TElement>> ToDictionarySafetyAsync<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, Task<TElement>> elementSelector, TElement defaultValue)
  677. {
  678. var items = source as IList<TSource> ?? source.ToList();
  679. var dic = new NullableDictionary<TKey, TElement>(items.Count)
  680. {
  681. FallbackValue = defaultValue
  682. };
  683. await items.ForeachAsync(async item => dic[keySelector(item)] = await elementSelector(item));
  684. return dic;
  685. }
  686. /// <summary>
  687. /// 安全的转换成字典集
  688. /// </summary>
  689. /// <typeparam name="TSource"></typeparam>
  690. /// <typeparam name="TKey"></typeparam>
  691. /// <param name="source"></param>
  692. /// <param name="keySelector">键选择器</param>
  693. public static DisposableDictionary<TKey, TSource> ToDisposableDictionarySafety<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector) where TSource : IDisposable
  694. {
  695. var items = source as IList<TSource> ?? source.ToList();
  696. var dic = new DisposableDictionary<TKey, TSource>(items.Count);
  697. foreach (var item in items)
  698. {
  699. dic[keySelector(item)] = item;
  700. }
  701. return dic;
  702. }
  703. /// <summary>
  704. /// 安全的转换成字典集
  705. /// </summary>
  706. /// <typeparam name="TSource"></typeparam>
  707. /// <typeparam name="TKey"></typeparam>
  708. /// <param name="source"></param>
  709. /// <param name="keySelector">键选择器</param>
  710. /// <param name="defaultValue">键未找到时的默认值</param>
  711. public static DisposableDictionary<TKey, TSource> ToDisposableDictionarySafety<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, TSource defaultValue) where TSource : IDisposable
  712. {
  713. var items = source as IList<TSource> ?? source.ToList();
  714. var dic = new DisposableDictionary<TKey, TSource>(items.Count)
  715. {
  716. FallbackValue = defaultValue
  717. };
  718. foreach (var item in items)
  719. {
  720. dic[keySelector(item)] = item;
  721. }
  722. return dic;
  723. }
  724. /// <summary>
  725. /// 安全的转换成字典集
  726. /// </summary>
  727. /// <typeparam name="TSource"></typeparam>
  728. /// <typeparam name="TKey"></typeparam>
  729. /// <typeparam name="TElement"></typeparam>
  730. /// <param name="source"></param>
  731. /// <param name="keySelector">键选择器</param>
  732. /// <param name="elementSelector">值选择器</param>
  733. public static DisposableDictionary<TKey, TElement> ToDisposableDictionarySafety<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector) where TElement : IDisposable
  734. {
  735. var items = source as IList<TSource> ?? source.ToList();
  736. var dic = new DisposableDictionary<TKey, TElement>(items.Count);
  737. foreach (var item in items)
  738. {
  739. dic[keySelector(item)] = elementSelector(item);
  740. }
  741. return dic;
  742. }
  743. /// <summary>
  744. /// 安全的转换成字典集
  745. /// </summary>
  746. /// <typeparam name="TSource"></typeparam>
  747. /// <typeparam name="TKey"></typeparam>
  748. /// <typeparam name="TElement"></typeparam>
  749. /// <param name="source"></param>
  750. /// <param name="keySelector">键选择器</param>
  751. /// <param name="elementSelector">值选择器</param>
  752. /// <param name="defaultValue">键未找到时的默认值</param>
  753. public static DisposableDictionary<TKey, TElement> ToDisposableDictionarySafety<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, TElement defaultValue) where TElement : IDisposable
  754. {
  755. var items = source as IList<TSource> ?? source.ToList();
  756. var dic = new DisposableDictionary<TKey, TElement>(items.Count)
  757. {
  758. FallbackValue = defaultValue
  759. };
  760. foreach (var item in items)
  761. {
  762. dic[keySelector(item)] = elementSelector(item);
  763. }
  764. return dic;
  765. }
  766. /// <summary>
  767. /// 安全的转换成字典集
  768. /// </summary>
  769. /// <typeparam name="TSource"></typeparam>
  770. /// <typeparam name="TKey"></typeparam>
  771. /// <typeparam name="TElement"></typeparam>
  772. /// <param name="source"></param>
  773. /// <param name="keySelector">键选择器</param>
  774. /// <param name="elementSelector">值选择器</param>
  775. public static async Task<DisposableDictionary<TKey, TElement>> ToDisposableDictionarySafetyAsync<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, Task<TElement>> elementSelector) where TElement : IDisposable
  776. {
  777. var items = source as IList<TSource> ?? source.ToList();
  778. var dic = new DisposableDictionary<TKey, TElement>(items.Count);
  779. await items.ForeachAsync(async item => dic[keySelector(item)] = await elementSelector(item));
  780. return dic;
  781. }
  782. /// <summary>
  783. /// 安全的转换成字典集
  784. /// </summary>
  785. /// <typeparam name="TSource"></typeparam>
  786. /// <typeparam name="TKey"></typeparam>
  787. /// <typeparam name="TElement"></typeparam>
  788. /// <param name="source"></param>
  789. /// <param name="keySelector">键选择器</param>
  790. /// <param name="elementSelector">值选择器</param>
  791. /// <param name="defaultValue">键未找到时的默认值</param>
  792. public static async Task<DisposableDictionary<TKey, TElement>> ToDisposableDictionarySafetyAsync<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, Task<TElement>> elementSelector, TElement defaultValue) where TElement : IDisposable
  793. {
  794. var items = source as IList<TSource> ?? source.ToList();
  795. var dic = new DisposableDictionary<TKey, TElement>(items.Count)
  796. {
  797. FallbackValue = defaultValue
  798. };
  799. await items.ForeachAsync(async item => dic[keySelector(item)] = await elementSelector(item));
  800. return dic;
  801. }
  802. /// <summary>
  803. /// 安全的转换成字典集
  804. /// </summary>
  805. /// <typeparam name="TSource"></typeparam>
  806. /// <typeparam name="TKey"></typeparam>
  807. /// <param name="source"></param>
  808. /// <param name="keySelector">键选择器</param>
  809. public static NullableConcurrentDictionary<TKey, TSource> ToConcurrentDictionary<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
  810. {
  811. var dic = new NullableConcurrentDictionary<TKey, TSource>();
  812. foreach (var item in source)
  813. {
  814. dic[keySelector(item)] = item;
  815. }
  816. return dic;
  817. }
  818. /// <summary>
  819. /// 安全的转换成字典集
  820. /// </summary>
  821. /// <typeparam name="TSource"></typeparam>
  822. /// <typeparam name="TKey"></typeparam>
  823. /// <param name="source"></param>
  824. /// <param name="keySelector">键选择器</param>
  825. /// <param name="defaultValue">键未找到时的默认值</param>
  826. public static NullableConcurrentDictionary<TKey, TSource> ToConcurrentDictionary<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, TSource defaultValue)
  827. {
  828. var dic = new NullableConcurrentDictionary<TKey, TSource>()
  829. {
  830. FallbackValue = defaultValue
  831. };
  832. foreach (var item in source)
  833. {
  834. dic[keySelector(item)] = item;
  835. }
  836. return dic;
  837. }
  838. /// <summary>
  839. /// 安全的转换成字典集
  840. /// </summary>
  841. /// <typeparam name="TSource"></typeparam>
  842. /// <typeparam name="TKey"></typeparam>
  843. /// <typeparam name="TElement"></typeparam>
  844. /// <param name="source"></param>
  845. /// <param name="keySelector">键选择器</param>
  846. /// <param name="elementSelector">值选择器</param>
  847. public static NullableConcurrentDictionary<TKey, TElement> ToConcurrentDictionary<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector)
  848. {
  849. var dic = new NullableConcurrentDictionary<TKey, TElement>();
  850. foreach (var item in source)
  851. {
  852. dic[keySelector(item)] = elementSelector(item);
  853. }
  854. return dic;
  855. }
  856. /// <summary>
  857. /// 安全的转换成字典集
  858. /// </summary>
  859. /// <typeparam name="TSource"></typeparam>
  860. /// <typeparam name="TKey"></typeparam>
  861. /// <typeparam name="TElement"></typeparam>
  862. /// <param name="source"></param>
  863. /// <param name="keySelector">键选择器</param>
  864. /// <param name="elementSelector">值选择器</param>
  865. /// <param name="defaultValue"></param>
  866. public static NullableConcurrentDictionary<TKey, TElement> ToConcurrentDictionary<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, TElement defaultValue)
  867. {
  868. var dic = new NullableConcurrentDictionary<TKey, TElement>()
  869. {
  870. FallbackValue = defaultValue
  871. };
  872. foreach (var item in source)
  873. {
  874. dic[keySelector(item)] = elementSelector(item);
  875. }
  876. return dic;
  877. }
  878. /// <summary>
  879. /// 安全的转换成字典集
  880. /// </summary>
  881. /// <typeparam name="TSource"></typeparam>
  882. /// <typeparam name="TKey"></typeparam>
  883. /// <typeparam name="TElement"></typeparam>
  884. /// <param name="source"></param>
  885. /// <param name="keySelector">键选择器</param>
  886. /// <param name="elementSelector">值选择器</param>
  887. public static async Task<NullableConcurrentDictionary<TKey, TElement>> ToConcurrentDictionaryAsync<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, Task<TElement>> elementSelector)
  888. {
  889. var dic = new ConcurrentDictionary<TKey, TElement>();
  890. await source.ForeachAsync(async item => dic[keySelector(item)] = await elementSelector(item));
  891. return dic;
  892. }
  893. /// <summary>
  894. /// 安全的转换成字典集
  895. /// </summary>
  896. /// <typeparam name="TSource"></typeparam>
  897. /// <typeparam name="TKey"></typeparam>
  898. /// <typeparam name="TElement"></typeparam>
  899. /// <param name="source"></param>
  900. /// <param name="keySelector">键选择器</param>
  901. /// <param name="elementSelector">值选择器</param>
  902. /// <param name="defaultValue">键未找到时的默认值</param>
  903. public static async Task<NullableConcurrentDictionary<TKey, TElement>> ToConcurrentDictionaryAsync<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, Task<TElement>> elementSelector, TElement defaultValue)
  904. {
  905. var dic = new NullableConcurrentDictionary<TKey, TElement>
  906. {
  907. FallbackValue = defaultValue
  908. };
  909. await source.ForeachAsync(async item => dic[keySelector(item)] = await elementSelector(item));
  910. return dic;
  911. }
  912. /// <summary>
  913. /// 安全的转换成字典集
  914. /// </summary>
  915. /// <typeparam name="TSource"></typeparam>
  916. /// <typeparam name="TKey"></typeparam>
  917. /// <param name="source"></param>
  918. /// <param name="keySelector">键选择器</param>
  919. public static DisposableConcurrentDictionary<TKey, TSource> ToDisposableConcurrentDictionary<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector) where TSource : IDisposable
  920. {
  921. var dic = new DisposableConcurrentDictionary<TKey, TSource>();
  922. foreach (var item in source)
  923. {
  924. dic[keySelector(item)] = item;
  925. }
  926. return dic;
  927. }
  928. /// <summary>
  929. /// 安全的转换成字典集
  930. /// </summary>
  931. /// <param name="source"></param>
  932. /// <param name="keySelector">键选择器</param>
  933. /// <param name="defaultValue">键未找到时的默认值</param>
  934. public static DisposableConcurrentDictionary<TKey, TSource> ToDisposableConcurrentDictionary<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, TSource defaultValue) where TSource : IDisposable
  935. {
  936. var dic = new DisposableConcurrentDictionary<TKey, TSource>
  937. {
  938. FallbackValue = defaultValue
  939. };
  940. foreach (var item in source)
  941. {
  942. dic[keySelector(item)] = item;
  943. }
  944. return dic;
  945. }
  946. /// <summary>
  947. /// 安全的转换成字典集
  948. /// </summary>
  949. /// <param name="source"></param>
  950. /// <param name="keySelector">键选择器</param>
  951. /// <param name="elementSelector">值选择器</param>
  952. public static DisposableConcurrentDictionary<TKey, TElement> ToDisposableConcurrentDictionary<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector) where TElement : IDisposable
  953. {
  954. var dic = new DisposableConcurrentDictionary<TKey, TElement>();
  955. foreach (var item in source)
  956. {
  957. dic[keySelector(item)] = elementSelector(item);
  958. }
  959. return dic;
  960. }
  961. /// <summary>
  962. /// 安全的转换成字典集
  963. /// </summary>
  964. /// <param name="source"></param>
  965. /// <param name="keySelector">键选择器</param>
  966. /// <param name="elementSelector">值选择器</param>
  967. /// <param name="defaultValue"></param>
  968. public static DisposableConcurrentDictionary<TKey, TElement> ToDisposableConcurrentDictionary<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, TElement defaultValue) where TElement : IDisposable
  969. {
  970. var dic = new DisposableConcurrentDictionary<TKey, TElement>()
  971. {
  972. FallbackValue = defaultValue
  973. };
  974. foreach (var item in source)
  975. {
  976. dic[keySelector(item)] = elementSelector(item);
  977. }
  978. return dic;
  979. }
  980. /// <summary>
  981. /// 安全的转换成字典集
  982. /// </summary>
  983. /// <param name="source"></param>
  984. /// <param name="keySelector">键选择器</param>
  985. /// <param name="elementSelector">值选择器</param>
  986. public static async Task<DisposableConcurrentDictionary<TKey, TElement>> ToDisposableConcurrentDictionaryAsync<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, Task<TElement>> elementSelector) where TElement : IDisposable
  987. {
  988. var dic = new DisposableConcurrentDictionary<TKey, TElement>();
  989. await source.ForeachAsync(async item => dic[keySelector(item)] = await elementSelector(item));
  990. return dic;
  991. }
  992. /// <summary>
  993. /// 安全的转换成字典集
  994. /// </summary>
  995. /// <param name="source"></param>
  996. /// <param name="keySelector">键选择器</param>
  997. /// <param name="elementSelector">值选择器</param>
  998. /// <param name="defaultValue">键未找到时的默认值</param>
  999. public static async Task<DisposableConcurrentDictionary<TKey, TElement>> ToDisposableConcurrentDictionaryAsync<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, Task<TElement>> elementSelector, TElement defaultValue) where TElement : IDisposable
  1000. {
  1001. var dic = new DisposableConcurrentDictionary<TKey, TElement>()
  1002. {
  1003. FallbackValue = defaultValue
  1004. };
  1005. await source.ForeachAsync(async item => dic[keySelector(item)] = await elementSelector(item));
  1006. return dic;
  1007. }
  1008. /// <summary>
  1009. /// 转换成并发字典集合
  1010. /// </summary>
  1011. public static NullableConcurrentDictionary<TKey, TValue> AsConcurrentDictionary<TKey, TValue>(this Dictionary<TKey, TValue> dic) => dic;
  1012. /// <summary>
  1013. /// 转换成并发字典集合
  1014. /// </summary>
  1015. /// <param name="dic"></param>
  1016. /// <param name="defaultValue">键未找到时的默认值</param>
  1017. public static NullableConcurrentDictionary<TKey, TValue> AsConcurrentDictionary<TKey, TValue>(this Dictionary<TKey, TValue> dic, TValue defaultValue)
  1018. {
  1019. var nullableDictionary = new NullableConcurrentDictionary<TKey, TValue>()
  1020. {
  1021. FallbackValue = defaultValue
  1022. };
  1023. foreach (var p in dic)
  1024. {
  1025. nullableDictionary[p.Key] = p.Value;
  1026. }
  1027. return nullableDictionary;
  1028. }
  1029. /// <summary>
  1030. /// 转换成普通字典集合
  1031. /// </summary>
  1032. public static NullableDictionary<TKey, TValue> AsDictionary<TKey, TValue>(this ConcurrentDictionary<TKey, TValue> dic) => dic;
  1033. /// <summary>
  1034. /// 转换成普通字典集合
  1035. /// </summary>
  1036. /// <param name="dic"></param>
  1037. /// <param name="defaultValue">键未找到时的默认值</param>
  1038. public static NullableDictionary<TKey, TValue> AsDictionary<TKey, TValue>(this ConcurrentDictionary<TKey, TValue> dic, TValue defaultValue)
  1039. {
  1040. var nullableDictionary = new NullableDictionary<TKey, TValue>()
  1041. {
  1042. FallbackValue = defaultValue
  1043. };
  1044. foreach (var p in dic)
  1045. {
  1046. nullableDictionary[p.Key] = p.Value;
  1047. }
  1048. return nullableDictionary;
  1049. }
  1050. }