|
1 | 1 | using System; |
2 | 2 | using System.Collections.Generic; |
| 3 | +using System.Threading.Tasks; |
3 | 4 |
|
4 | 5 | namespace Common.BasicHelper.Util.Extension; |
5 | 6 |
|
@@ -40,11 +41,11 @@ public static Queue<T> Pop<T>(this Queue<T> queue) |
40 | 41 | public static bool IsEmpty<T>(this Queue<T> queue) => queue.Count == 0; |
41 | 42 |
|
42 | 43 | /// <summary> |
43 | | - /// 判断队列是否为空 |
| 44 | + /// 判断队列是否非空 |
44 | 45 | /// </summary> |
45 | 46 | /// <typeparam name="T">队列类型</typeparam> |
46 | 47 | /// <param name="queue">队列</param> |
47 | | - /// <returns>是否为空</returns> |
| 48 | + /// <returns>是否非空</returns> |
48 | 49 | public static bool IsNotEmpty<T>(this Queue<T> queue) => queue.Count > 0; |
49 | 50 |
|
50 | 51 | /// <summary> |
@@ -81,4 +82,32 @@ Queue<T> func() |
81 | 82 | } |
82 | 83 | else return func(); |
83 | 84 | } |
| 85 | + |
| 86 | + /// <summary> |
| 87 | + /// 异步遍历队列对每一个元素执行操作, 执行完毕后返回队列本身 |
| 88 | + /// </summary> |
| 89 | + /// <typeparam name="T">队列类型</typeparam> |
| 90 | + /// <param name="queue">队列</param> |
| 91 | + /// <param name="action">对元素的操作</param> |
| 92 | + /// <param name="reappend">是否将出队元素重新入队</param> |
| 93 | + /// <param name="locker">操作锁</param> |
| 94 | + /// <returns>返回队列本身的任务</returns> |
| 95 | + public static async Task<Queue<T>> ForEachAsync<T>(this Queue<T> queue, Action<T> action, |
| 96 | + bool reappend = false) |
| 97 | + { |
| 98 | + Queue<T> func() |
| 99 | + { |
| 100 | + var count = queue.Count; |
| 101 | + while (count > 0) |
| 102 | + { |
| 103 | + var item = queue.Dequeue(); |
| 104 | + action.Invoke(item); |
| 105 | + --count; |
| 106 | + if (reappend) queue.Enqueue(item); |
| 107 | + } |
| 108 | + return queue; |
| 109 | + } |
| 110 | + |
| 111 | + return await Task.Run(func); |
| 112 | + } |
84 | 113 | } |
0 commit comments