IDictionaryExtensions.cs 52 KB

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