Browse Source

一些逻辑增强

懒得勤快 3 years ago
parent
commit
7a4de73ff0

+ 1 - 1
Masuit.Tools.Abstractions/Extensions/BaseType/IConvertibleExtensions.cs

@@ -205,7 +205,7 @@ public static class IConvertibleExtensions
                 return converter.ConvertFrom(value);
                 return converter.ConvertFrom(value);
             }
             }
         }
         }
+        return Convert.ChangeType(value, type);
 
 
-        return value;
     }
     }
 }
 }

+ 925 - 922
Masuit.Tools.Abstractions/Extensions/BaseType/IEnumerableExtensions.cs

@@ -7,1095 +7,1098 @@ using System.Linq.Expressions;
 using System.Threading;
 using System.Threading;
 using System.Threading.Tasks;
 using System.Threading.Tasks;
 
 
-namespace Masuit.Tools
+namespace Masuit.Tools;
+
+public static class IEnumerableExtensions
 {
 {
-    public static class IEnumerableExtensions
+    /// <summary>
+    /// 按字段属性判等取交集
+    /// </summary>
+    /// <typeparam name="TFirst"></typeparam>
+    /// <typeparam name="TSecond"></typeparam>
+    /// <param name="second"></param>
+    /// <param name="condition"></param>
+    /// <param name="first"></param>
+    /// <returns></returns>
+    public static IEnumerable<TFirst> IntersectBy<TFirst, TSecond>(this IEnumerable<TFirst> first, IEnumerable<TSecond> second, Func<TFirst, TSecond, bool> condition)
     {
     {
-        /// <summary>
-        /// 按字段属性判等取交集
-        /// </summary>
-        /// <typeparam name="TFirst"></typeparam>
-        /// <typeparam name="TSecond"></typeparam>
-        /// <param name="second"></param>
-        /// <param name="condition"></param>
-        /// <param name="first"></param>
-        /// <returns></returns>
-        public static IEnumerable<TFirst> IntersectBy<TFirst, TSecond>(this IEnumerable<TFirst> first, IEnumerable<TSecond> second, Func<TFirst, TSecond, bool> condition)
-        {
-            return first.Where(f => second.Any(s => condition(f, s)));
-        }
+        return first.Where(f => second.Any(s => condition(f, s)));
+    }
 
 
-        /// <summary>
-        /// 按字段属性判等取交集
-        /// </summary>
-        /// <typeparam name="TSource"></typeparam>
-        /// <typeparam name="TKey"></typeparam>
-        /// <param name="first"></param>
-        /// <param name="second"></param>
-        /// <param name="keySelector"></param>
-        /// <returns></returns>
-        public static IEnumerable<TSource> IntersectBy<TSource, TKey>(this IEnumerable<TSource> first, IEnumerable<TSource> second, Func<TSource, TKey> keySelector)
-        {
-            return first.IntersectBy(second, keySelector, null);
-        }
+    /// <summary>
+    /// 按字段属性判等取交集
+    /// </summary>
+    /// <typeparam name="TSource"></typeparam>
+    /// <typeparam name="TKey"></typeparam>
+    /// <param name="first"></param>
+    /// <param name="second"></param>
+    /// <param name="keySelector"></param>
+    /// <returns></returns>
+    public static IEnumerable<TSource> IntersectBy<TSource, TKey>(this IEnumerable<TSource> first, IEnumerable<TSource> second, Func<TSource, TKey> keySelector)
+    {
+        return first.IntersectBy(second, keySelector, null);
+    }
 
 
-        /// <summary>
-        /// 按字段属性判等取交集
-        /// </summary>
-        /// <typeparam name="TSource"></typeparam>
-        /// <typeparam name="TKey"></typeparam>
-        /// <param name="first"></param>
-        /// <param name="second"></param>
-        /// <param name="keySelector"></param>
-        /// <returns></returns>
-        public static IEnumerable<TSource> IntersectBy<TSource, TKey>(this IEnumerable<TSource> first, IEnumerable<TSource> second, Func<TSource, TKey> keySelector, IEqualityComparer<TKey>? comparer)
-        {
-            if (first == null)
-                throw new ArgumentNullException(nameof(first));
-            if (second == null)
-                throw new ArgumentNullException(nameof(second));
-            if (keySelector == null)
-                throw new ArgumentNullException(nameof(keySelector));
-            return IntersectByIterator(first, second, keySelector, comparer);
-        }
+    /// <summary>
+    /// 按字段属性判等取交集
+    /// </summary>
+    /// <typeparam name="TSource"></typeparam>
+    /// <typeparam name="TKey"></typeparam>
+    /// <param name="first"></param>
+    /// <param name="second"></param>
+    /// <param name="keySelector"></param>
+    /// <returns></returns>
+    public static IEnumerable<TSource> IntersectBy<TSource, TKey>(this IEnumerable<TSource> first, IEnumerable<TSource> second, Func<TSource, TKey> keySelector, IEqualityComparer<TKey>? comparer)
+    {
+        if (first == null)
+            throw new ArgumentNullException(nameof(first));
+        if (second == null)
+            throw new ArgumentNullException(nameof(second));
+        if (keySelector == null)
+            throw new ArgumentNullException(nameof(keySelector));
+        return IntersectByIterator(first, second, keySelector, comparer);
+    }
 
 
-        private static IEnumerable<TSource> IntersectByIterator<TSource, TKey>(IEnumerable<TSource> first, IEnumerable<TSource> second, Func<TSource, TKey> keySelector, IEqualityComparer<TKey> comparer)
+    private static IEnumerable<TSource> IntersectByIterator<TSource, TKey>(IEnumerable<TSource> first, IEnumerable<TSource> second, Func<TSource, TKey> keySelector, IEqualityComparer<TKey> comparer)
+    {
+        var set = new HashSet<TKey>(second.Select(keySelector), comparer);
+        foreach (var source in first)
         {
         {
-            var set = new HashSet<TKey>(second.Select(keySelector), comparer);
-            foreach (var source in first)
-            {
-                if (set.Remove(keySelector(source)))
-                    yield return source;
-            }
+            if (set.Remove(keySelector(source)))
+                yield return source;
         }
         }
+    }
 
 
 
 
-        /// <summary>
-        /// 多个集合取交集元素
-        /// </summary>
-        /// <typeparam name="T"></typeparam>
-        /// <param name="source"></param>
-        /// <returns></returns>
-        public static IEnumerable<T> IntersectAll<T>(this IEnumerable<IEnumerable<T>> source)
-        {
-            return source.Aggregate((current, item) => current.Intersect(item));
-        }
+    /// <summary>
+    /// 多个集合取交集元素
+    /// </summary>
+    /// <typeparam name="T"></typeparam>
+    /// <param name="source"></param>
+    /// <returns></returns>
+    public static IEnumerable<T> IntersectAll<T>(this IEnumerable<IEnumerable<T>> source)
+    {
+        return source.Aggregate((current, item) => current.Intersect(item));
+    }
 
 
-        /// <summary>
-        /// 多个集合取交集元素
-        /// </summary>
-        /// <typeparam name="TSource"></typeparam>
-        /// <param name="source"></param>
-        /// <returns></returns>
-        public static IEnumerable<TSource> IntersectAll<TSource, TKey>(this IEnumerable<IEnumerable<TSource>> source, Func<TSource, TKey> keySelector)
-        {
-            return source.Aggregate((current, item) => current.IntersectBy(item, keySelector));
-        }
+    /// <summary>
+    /// 多个集合取交集元素
+    /// </summary>
+    /// <typeparam name="TSource"></typeparam>
+    /// <param name="source"></param>
+    /// <returns></returns>
+    public static IEnumerable<TSource> IntersectAll<TSource, TKey>(this IEnumerable<IEnumerable<TSource>> source, Func<TSource, TKey> keySelector)
+    {
+        return source.Aggregate((current, item) => current.IntersectBy(item, keySelector));
+    }
 
 
-        /// <summary>
-        /// 多个集合取交集元素
-        /// </summary>
-        /// <typeparam name="TSource"></typeparam>
-        /// <param name="source"></param>
-        /// <returns></returns>
-        public static IEnumerable<TSource> IntersectAll<TSource, TKey>(this IEnumerable<IEnumerable<TSource>> source, Func<TSource, TKey> keySelector, IEqualityComparer<TKey> comparer)
-        {
-            return source.Aggregate((current, item) => current.IntersectBy(item, keySelector, comparer));
-        }
+    /// <summary>
+    /// 多个集合取交集元素
+    /// </summary>
+    /// <typeparam name="TSource"></typeparam>
+    /// <param name="source"></param>
+    /// <returns></returns>
+    public static IEnumerable<TSource> IntersectAll<TSource, TKey>(this IEnumerable<IEnumerable<TSource>> source, Func<TSource, TKey> keySelector, IEqualityComparer<TKey> comparer)
+    {
+        return source.Aggregate((current, item) => current.IntersectBy(item, keySelector, comparer));
+    }
 
 
-        /// <summary>
-        /// 多个集合取交集元素
-        /// </summary>
-        /// <typeparam name="T"></typeparam>
-        /// <param name="source"></param>
-        /// <returns></returns>
-        public static IEnumerable<T> IntersectAll<T>(this IEnumerable<IEnumerable<T>> source, IEqualityComparer<T> comparer)
-        {
-            return source.Aggregate((current, item) => current.Intersect(item, comparer));
-        }
+    /// <summary>
+    /// 多个集合取交集元素
+    /// </summary>
+    /// <typeparam name="T"></typeparam>
+    /// <param name="source"></param>
+    /// <returns></returns>
+    public static IEnumerable<T> IntersectAll<T>(this IEnumerable<IEnumerable<T>> source, IEqualityComparer<T> comparer)
+    {
+        return source.Aggregate((current, item) => current.Intersect(item, comparer));
+    }
 
 
-        /// <summary>
-        /// 按字段属性判等取差集
-        /// </summary>
-        /// <typeparam name="TFirst"></typeparam>
-        /// <typeparam name="TSecond"></typeparam>
-        /// <param name="second"></param>
-        /// <param name="condition"></param>
-        /// <param name="first"></param>
-        /// <returns></returns>
-        public static IEnumerable<TFirst> ExceptBy<TFirst, TSecond>(this IEnumerable<TFirst> first, IEnumerable<TSecond> second, Func<TFirst, TSecond, bool> condition)
-        {
-            return first.Where(f => !second.Any(s => condition(f, s)));
-        }
+    /// <summary>
+    /// 按字段属性判等取差集
+    /// </summary>
+    /// <typeparam name="TFirst"></typeparam>
+    /// <typeparam name="TSecond"></typeparam>
+    /// <param name="second"></param>
+    /// <param name="condition"></param>
+    /// <param name="first"></param>
+    /// <returns></returns>
+    public static IEnumerable<TFirst> ExceptBy<TFirst, TSecond>(this IEnumerable<TFirst> first, IEnumerable<TSecond> second, Func<TFirst, TSecond, bool> condition)
+    {
+        return first.Where(f => !second.Any(s => condition(f, s)));
+    }
 
 
 #if NET6_0_OR_GREATER
 #if NET6_0_OR_GREATER
 #else
 #else
 
 
-        /// <summary>
-        /// 按字段去重
-        /// </summary>
-        /// <typeparam name="TSource"></typeparam>
-        /// <typeparam name="TKey"></typeparam>
-        /// <param name="source"></param>
-        /// <param name="keySelector"></param>
-        /// <returns></returns>
-        public static IEnumerable<TSource> DistinctBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
-        {
-            var hash = new HashSet<TKey>();
-            return source.Where(p => hash.Add(keySelector(p)));
-        }
+    /// <summary>
+    /// 按字段去重
+    /// </summary>
+    /// <typeparam name="TSource"></typeparam>
+    /// <typeparam name="TKey"></typeparam>
+    /// <param name="source"></param>
+    /// <param name="keySelector"></param>
+    /// <returns></returns>
+    public static IEnumerable<TSource> DistinctBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
+    {
+        var hash = new HashSet<TKey>();
+        return source.Where(p => hash.Add(keySelector(p)));
+    }
 
 
-        /// <summary>
-        /// 按字段属性判等取交集
-        /// </summary>
-        /// <typeparam name="TSource"></typeparam>
-        /// <typeparam name="TKey"></typeparam>
-        /// <param name="first"></param>
-        /// <param name="second"></param>
-        /// <param name="keySelector"></param>
-        /// <returns></returns>
-        public static IEnumerable<TSource> IntersectBy<TSource, TKey>(this IEnumerable<TSource> first, IEnumerable<TKey> second, Func<TSource, TKey> keySelector)
-        {
-            return first.IntersectBy(second, keySelector, null);
-        }
+    /// <summary>
+    /// 按字段属性判等取交集
+    /// </summary>
+    /// <typeparam name="TSource"></typeparam>
+    /// <typeparam name="TKey"></typeparam>
+    /// <param name="first"></param>
+    /// <param name="second"></param>
+    /// <param name="keySelector"></param>
+    /// <returns></returns>
+    public static IEnumerable<TSource> IntersectBy<TSource, TKey>(this IEnumerable<TSource> first, IEnumerable<TKey> second, Func<TSource, TKey> keySelector)
+    {
+        return first.IntersectBy(second, keySelector, null);
+    }
 
 
-        /// <summary>
-        /// 按字段属性判等取交集
-        /// </summary>
-        /// <typeparam name="TSource"></typeparam>
-        /// <typeparam name="TKey"></typeparam>
-        /// <param name="first"></param>
-        /// <param name="second"></param>
-        /// <param name="keySelector"></param>
-        /// <returns></returns>
-        public static IEnumerable<TSource> IntersectBy<TSource, TKey>(this IEnumerable<TSource> first, IEnumerable<TKey> second, Func<TSource, TKey> keySelector, IEqualityComparer<TKey>? comparer)
+    /// <summary>
+    /// 按字段属性判等取交集
+    /// </summary>
+    /// <typeparam name="TSource"></typeparam>
+    /// <typeparam name="TKey"></typeparam>
+    /// <param name="first"></param>
+    /// <param name="second"></param>
+    /// <param name="keySelector"></param>
+    /// <returns></returns>
+    public static IEnumerable<TSource> IntersectBy<TSource, TKey>(this IEnumerable<TSource> first, IEnumerable<TKey> second, Func<TSource, TKey> keySelector, IEqualityComparer<TKey>? comparer)
+    {
+        if (first == null)
+            throw new ArgumentNullException(nameof(first));
+        if (second == null)
+            throw new ArgumentNullException(nameof(second));
+        if (keySelector == null)
+            throw new ArgumentNullException(nameof(keySelector));
+        return IntersectByIterator(first, second, keySelector, comparer);
+    }
+
+    private static IEnumerable<TSource> IntersectByIterator<TSource, TKey>(IEnumerable<TSource> first, IEnumerable<TKey> second, Func<TSource, TKey> keySelector, IEqualityComparer<TKey> comparer)
+    {
+        var set = new HashSet<TKey>(second, comparer);
+        foreach (var source in first)
         {
         {
-            if (first == null)
-                throw new ArgumentNullException(nameof(first));
-            if (second == null)
-                throw new ArgumentNullException(nameof(second));
-            if (keySelector == null)
-                throw new ArgumentNullException(nameof(keySelector));
-            return IntersectByIterator(first, second, keySelector, comparer);
+            if (set.Remove(keySelector(source)))
+                yield return source;
         }
         }
+    }
+
+    /// <summary>
+    /// 按字段属性判等取差集
+    /// </summary>
+    /// <typeparam name="TSource"></typeparam>
+    /// <typeparam name="TKey"></typeparam>
+    /// <param name="first"></param>
+    /// <param name="second"></param>
+    /// <param name="keySelector"></param>
+    /// <returns></returns>
+    public static IEnumerable<TSource> ExceptBy<TSource, TKey>(this IEnumerable<TSource> first, IEnumerable<TKey> second, Func<TSource, TKey> keySelector)
+    {
+        return first.ExceptBy(second, keySelector, null);
+    }
 
 
-        private static IEnumerable<TSource> IntersectByIterator<TSource, TKey>(IEnumerable<TSource> first, IEnumerable<TKey> second, Func<TSource, TKey> keySelector, IEqualityComparer<TKey> comparer)
+    /// <summary>
+    /// 按字段属性判等取差集
+    /// </summary>
+    /// <typeparam name="TSource"></typeparam>
+    /// <typeparam name="TKey"></typeparam>
+    /// <param name="first"></param>
+    /// <param name="second"></param>
+    /// <param name="keySelector"></param>
+    /// <param name="comparer"></param>
+    /// <returns></returns>
+    /// <exception cref="ArgumentNullException"></exception>
+    public static IEnumerable<TSource> ExceptBy<TSource, TKey>(this IEnumerable<TSource> first, IEnumerable<TKey> second, Func<TSource, TKey> keySelector, IEqualityComparer<TKey>? comparer)
+    {
+        if (first == null)
+            throw new ArgumentNullException(nameof(first));
+        if (second == null)
+            throw new ArgumentNullException(nameof(second));
+        if (keySelector == null)
+            throw new ArgumentNullException(nameof(keySelector));
+        return ExceptByIterator(first, second, keySelector, comparer);
+    }
+
+    private static IEnumerable<TSource> ExceptByIterator<TSource, TKey>(IEnumerable<TSource> first, IEnumerable<TKey> second, Func<TSource, TKey> keySelector, IEqualityComparer<TKey> comparer)
+    {
+        var set = new HashSet<TKey>(second, comparer);
+        foreach (var source in first)
         {
         {
-            var set = new HashSet<TKey>(second, comparer);
-            foreach (var source in first)
-            {
-                if (set.Remove(keySelector(source)))
-                    yield return source;
-            }
+            if (set.Add(keySelector(source)))
+                yield return source;
         }
         }
+    }
+
+#endif
 
 
-        /// <summary>
-        /// 按字段属性判等取差集
-        /// </summary>
-        /// <typeparam name="TSource"></typeparam>
-        /// <typeparam name="TKey"></typeparam>
-        /// <param name="first"></param>
-        /// <param name="second"></param>
-        /// <param name="keySelector"></param>
-        /// <returns></returns>
-        public static IEnumerable<TSource> ExceptBy<TSource, TKey>(this IEnumerable<TSource> first, IEnumerable<TKey> second, Func<TSource, TKey> keySelector)
+    /// <summary>
+    /// 添加多个元素
+    /// </summary>
+    /// <typeparam name="T"></typeparam>
+    /// <param name="this"></param>
+    /// <param name="values"></param>
+    public static void AddRange<T>(this ICollection<T> @this, params T[] values)
+    {
+        foreach (var obj in values)
         {
         {
-            return first.ExceptBy(second, keySelector, null);
+            @this.Add(obj);
         }
         }
+    }
 
 
-        /// <summary>
-        /// 按字段属性判等取差集
-        /// </summary>
-        /// <typeparam name="TSource"></typeparam>
-        /// <typeparam name="TKey"></typeparam>
-        /// <param name="first"></param>
-        /// <param name="second"></param>
-        /// <param name="keySelector"></param>
-        /// <param name="comparer"></param>
-        /// <returns></returns>
-        /// <exception cref="ArgumentNullException"></exception>
-        public static IEnumerable<TSource> ExceptBy<TSource, TKey>(this IEnumerable<TSource> first, IEnumerable<TKey> second, Func<TSource, TKey> keySelector, IEqualityComparer<TKey>? comparer)
+    /// <summary>
+    /// 添加多个元素
+    /// </summary>
+    /// <typeparam name="T"></typeparam>
+    /// <param name="this"></param>
+    /// <param name="values"></param>
+    public static void AddRange<T>(this ICollection<T> @this, IEnumerable<T> values)
+    {
+        foreach (var obj in values)
         {
         {
-            if (first == null)
-                throw new ArgumentNullException(nameof(first));
-            if (second == null)
-                throw new ArgumentNullException(nameof(second));
-            if (keySelector == null)
-                throw new ArgumentNullException(nameof(keySelector));
-            return ExceptByIterator(first, second, keySelector, comparer);
+            @this.Add(obj);
         }
         }
+    }
 
 
-        private static IEnumerable<TSource> ExceptByIterator<TSource, TKey>(IEnumerable<TSource> first, IEnumerable<TKey> second, Func<TSource, TKey> keySelector, IEqualityComparer<TKey> comparer)
+    /// <summary>
+    /// 添加多个元素
+    /// </summary>
+    /// <typeparam name="T"></typeparam>
+    /// <param name="this"></param>
+    /// <param name="values"></param>
+    public static void AddRange<T>(this ConcurrentBag<T> @this, params T[] values)
+    {
+        foreach (var obj in values)
         {
         {
-            var set = new HashSet<TKey>(second, comparer);
-            foreach (var source in first)
-            {
-                if (set.Add(keySelector(source)))
-                    yield return source;
-            }
+            @this.Add(obj);
         }
         }
+    }
 
 
-#endif
-
-        /// <summary>
-        /// 添加多个元素
-        /// </summary>
-        /// <typeparam name="T"></typeparam>
-        /// <param name="this"></param>
-        /// <param name="values"></param>
-        public static void AddRange<T>(this ICollection<T> @this, params T[] values)
+    /// <summary>
+    /// 添加多个元素
+    /// </summary>
+    /// <typeparam name="T"></typeparam>
+    /// <param name="this"></param>
+    /// <param name="values"></param>
+    public static void AddRange<T>(this ConcurrentQueue<T> @this, params T[] values)
+    {
+        foreach (var obj in values)
         {
         {
-            foreach (var obj in values)
-            {
-                @this.Add(obj);
-            }
+            @this.Enqueue(obj);
         }
         }
+    }
 
 
-        /// <summary>
-        /// 添加多个元素
-        /// </summary>
-        /// <typeparam name="T"></typeparam>
-        /// <param name="this"></param>
-        /// <param name="values"></param>
-        public static void AddRange<T>(this ICollection<T> @this, IEnumerable<T> values)
+    /// <summary>
+    /// 添加符合条件的多个元素
+    /// </summary>
+    /// <typeparam name="T"></typeparam>
+    /// <param name="this"></param>
+    /// <param name="predicate"></param>
+    /// <param name="values"></param>
+    public static void AddRangeIf<T>(this ICollection<T> @this, Func<T, bool> predicate, params T[] values)
+    {
+        foreach (var obj in values)
         {
         {
-            foreach (var obj in values)
+            if (predicate(obj))
             {
             {
                 @this.Add(obj);
                 @this.Add(obj);
             }
             }
         }
         }
+    }
 
 
-        /// <summary>
-        /// 添加多个元素
-        /// </summary>
-        /// <typeparam name="T"></typeparam>
-        /// <param name="this"></param>
-        /// <param name="values"></param>
-        public static void AddRange<T>(this ConcurrentBag<T> @this, params T[] values)
+    /// <summary>
+    /// 添加符合条件的多个元素
+    /// </summary>
+    /// <typeparam name="T"></typeparam>
+    /// <param name="this"></param>
+    /// <param name="predicate"></param>
+    /// <param name="values"></param>
+    public static void AddRangeIf<T>(this ConcurrentBag<T> @this, Func<T, bool> predicate, params T[] values)
+    {
+        foreach (var obj in values)
         {
         {
-            foreach (var obj in values)
+            if (predicate(obj))
             {
             {
                 @this.Add(obj);
                 @this.Add(obj);
             }
             }
         }
         }
+    }
 
 
-        /// <summary>
-        /// 添加多个元素
-        /// </summary>
-        /// <typeparam name="T"></typeparam>
-        /// <param name="this"></param>
-        /// <param name="values"></param>
-        public static void AddRange<T>(this ConcurrentQueue<T> @this, params T[] values)
+    /// <summary>
+    /// 添加符合条件的多个元素
+    /// </summary>
+    /// <typeparam name="T"></typeparam>
+    /// <param name="this"></param>
+    /// <param name="predicate"></param>
+    /// <param name="values"></param>
+    public static void AddRangeIf<T>(this ConcurrentQueue<T> @this, Func<T, bool> predicate, params T[] values)
+    {
+        foreach (var obj in values)
         {
         {
-            foreach (var obj in values)
+            if (predicate(obj))
             {
             {
                 @this.Enqueue(obj);
                 @this.Enqueue(obj);
             }
             }
         }
         }
+    }
 
 
-        /// <summary>
-        /// 添加符合条件的多个元素
-        /// </summary>
-        /// <typeparam name="T"></typeparam>
-        /// <param name="this"></param>
-        /// <param name="predicate"></param>
-        /// <param name="values"></param>
-        public static void AddRangeIf<T>(this ICollection<T> @this, Func<T, bool> predicate, params T[] values)
+    /// <summary>
+    /// 添加不重复的元素
+    /// </summary>
+    /// <typeparam name="T"></typeparam>
+    /// <param name="this"></param>
+    /// <param name="values"></param>
+    public static void AddRangeIfNotContains<T>(this ICollection<T> @this, params T[] values)
+    {
+        foreach (T obj in values)
         {
         {
-            foreach (var obj in values)
+            if ([email protected](obj))
             {
             {
-                if (predicate(obj))
-                {
-                    @this.Add(obj);
-                }
+                @this.Add(obj);
             }
             }
         }
         }
+    }
 
 
-        /// <summary>
-        /// 添加符合条件的多个元素
-        /// </summary>
-        /// <typeparam name="T"></typeparam>
-        /// <param name="this"></param>
-        /// <param name="predicate"></param>
-        /// <param name="values"></param>
-        public static void AddRangeIf<T>(this ConcurrentBag<T> @this, Func<T, bool> predicate, params T[] values)
+    /// <summary>
+    /// 移除符合条件的元素
+    /// </summary>
+    /// <typeparam name="T"></typeparam>
+    /// <param name="this"></param>
+    /// <param name="where"></param>
+    public static void RemoveWhere<T>(this ICollection<T> @this, Func<T, bool> @where)
+    {
+        foreach (var obj in @this.Where(where).ToList())
         {
         {
-            foreach (var obj in values)
-            {
-                if (predicate(obj))
-                {
-                    @this.Add(obj);
-                }
-            }
+            @this.Remove(obj);
         }
         }
+    }
 
 
-        /// <summary>
-        /// 添加符合条件的多个元素
-        /// </summary>
-        /// <typeparam name="T"></typeparam>
-        /// <param name="this"></param>
-        /// <param name="predicate"></param>
-        /// <param name="values"></param>
-        public static void AddRangeIf<T>(this ConcurrentQueue<T> @this, Func<T, bool> predicate, params T[] values)
+    /// <summary>
+    /// 在元素之后添加元素
+    /// </summary>
+    /// <typeparam name="T"></typeparam>
+    /// <param name="list"></param>
+    /// <param name="condition">条件</param>
+    /// <param name="value">值</param>
+    public static void InsertAfter<T>(this IList<T> list, Func<T, bool> condition, T value)
+    {
+        foreach (var item in list.Select((item, index) => new
         {
         {
-            foreach (var obj in values)
-            {
-                if (predicate(obj))
-                {
-                    @this.Enqueue(obj);
-                }
-            }
-        }
-
-        /// <summary>
-        /// 添加不重复的元素
-        /// </summary>
-        /// <typeparam name="T"></typeparam>
-        /// <param name="this"></param>
-        /// <param name="values"></param>
-        public static void AddRangeIfNotContains<T>(this ICollection<T> @this, params T[] values)
+            item,
+            index
+        }).Where(p => condition(p.item)).OrderByDescending(p => p.index))
         {
         {
-            foreach (T obj in values)
+            if (item.index + 1 == list.Count)
             {
             {
-                if ([email protected](obj))
-                {
-                    @this.Add(obj);
-                }
+                list.Add(value);
             }
             }
-        }
-
-        /// <summary>
-        /// 移除符合条件的元素
-        /// </summary>
-        /// <typeparam name="T"></typeparam>
-        /// <param name="this"></param>
-        /// <param name="where"></param>
-        public static void RemoveWhere<T>(this ICollection<T> @this, Func<T, bool> @where)
-        {
-            foreach (var obj in @this.Where(where).ToList())
+            else
             {
             {
-                @this.Remove(obj);
+                list.Insert(item.index + 1, value);
             }
             }
         }
         }
+    }
 
 
-        /// <summary>
-        /// 在元素之后添加元素
-        /// </summary>
-        /// <typeparam name="T"></typeparam>
-        /// <param name="list"></param>
-        /// <param name="condition">条件</param>
-        /// <param name="value">值</param>
-        public static void InsertAfter<T>(this IList<T> list, Func<T, bool> condition, T value)
+    /// <summary>
+    /// 在元素之后添加元素
+    /// </summary>
+    /// <typeparam name="T"></typeparam>
+    /// <param name="list"></param>
+    /// <param name="index">索引位置</param>
+    /// <param name="value">值</param>
+    public static void InsertAfter<T>(this IList<T> list, int index, T value)
+    {
+        foreach (var item in list.Select((v, i) => new
         {
         {
-            foreach (var item in list.Select((item, index) => new
-            {
-                item,
-                index
-            }).Where(p => condition(p.item)).OrderByDescending(p => p.index))
-            {
-                if (item.index + 1 == list.Count)
-                {
-                    list.Add(value);
-                }
-                else
-                {
-                    list.Insert(item.index + 1, value);
-                }
-            }
-        }
-
-        /// <summary>
-        /// 在元素之后添加元素
-        /// </summary>
-        /// <typeparam name="T"></typeparam>
-        /// <param name="list"></param>
-        /// <param name="index">索引位置</param>
-        /// <param name="value">值</param>
-        public static void InsertAfter<T>(this IList<T> list, int index, T value)
+            Value = v,
+            Index = i
+        }).Where(p => p.Index == index).OrderByDescending(p => p.Index))
         {
         {
-            foreach (var item in list.Select((v, i) => new
+            if (item.Index + 1 == list.Count)
             {
             {
-                Value = v,
-                Index = i
-            }).Where(p => p.Index == index).OrderByDescending(p => p.Index))
+                list.Add(value);
+            }
+            else
             {
             {
-                if (item.Index + 1 == list.Count)
-                {
-                    list.Add(value);
-                }
-                else
-                {
-                    list.Insert(item.Index + 1, value);
-                }
+                list.Insert(item.Index + 1, value);
             }
             }
         }
         }
+    }
 
 
-        /// <summary>
-        /// 转HashSet
-        /// </summary>
-        /// <typeparam name="T"></typeparam>
-        /// <typeparam name="TResult"></typeparam>
-        /// <param name="source"></param>
-        /// <param name="selector"></param>
-        /// <returns></returns>
-        public static HashSet<TResult> ToHashSet<T, TResult>(this IEnumerable<T> source, Func<T, TResult> selector)
+    /// <summary>
+    /// 转HashSet
+    /// </summary>
+    /// <typeparam name="T"></typeparam>
+    /// <typeparam name="TResult"></typeparam>
+    /// <param name="source"></param>
+    /// <param name="selector"></param>
+    /// <returns></returns>
+    public static HashSet<TResult> ToHashSet<T, TResult>(this IEnumerable<T> source, Func<T, TResult> selector)
+    {
+        var set = new HashSet<TResult>();
+        set.UnionWith(source.Select(selector));
+        return set;
+    }
+
+    /// <summary>
+    /// 遍历IEnumerable
+    /// </summary>
+    /// <param name="objs"></param>
+    /// <param name="action">回调方法</param>
+    /// <typeparam name="T"></typeparam>
+    public static void ForEach<T>(this IEnumerable<T> objs, Action<T> action)
+    {
+        foreach (var o in objs)
         {
         {
-            var set = new HashSet<TResult>();
-            set.UnionWith(source.Select(selector));
-            return set;
+            action(o);
         }
         }
+    }
 
 
-        /// <summary>
-        /// 遍历IEnumerable
-        /// </summary>
-        /// <param name="objs"></param>
-        /// <param name="action">回调方法</param>
-        /// <typeparam name="T"></typeparam>
-        public static void ForEach<T>(this IEnumerable<T> objs, Action<T> action)
+    /// <summary>
+    /// 异步foreach
+    /// </summary>
+    /// <typeparam name="T"></typeparam>
+    /// <param name="source"></param>
+    /// <param name="maxParallelCount">最大并行数</param>
+    /// <param name="action"></param>
+    /// <param name="cancellationToken"></param>
+    /// <returns></returns>
+    public static async Task ForeachAsync<T>(this IEnumerable<T> source, Func<T, Task> action, int maxParallelCount, CancellationToken cancellationToken = default)
+    {
+        if (Debugger.IsAttached)
         {
         {
-            foreach (var o in objs)
+            foreach (var item in source)
             {
             {
-                action(o);
+                await action(item);
             }
             }
+
+            return;
         }
         }
 
 
-        /// <summary>
-        /// 异步foreach
-        /// </summary>
-        /// <typeparam name="T"></typeparam>
-        /// <param name="source"></param>
-        /// <param name="maxParallelCount">最大并行数</param>
-        /// <param name="action"></param>
-        /// <param name="cancellationToken"></param>
-        /// <returns></returns>
-        public static async Task ForeachAsync<T>(this IEnumerable<T> source, Func<T, Task> action, int maxParallelCount, CancellationToken cancellationToken = default)
+        var list = new List<Task>();
+        foreach (var item in source)
         {
         {
-            if (Debugger.IsAttached)
+            if (cancellationToken.IsCancellationRequested)
             {
             {
-                foreach (var item in source)
-                {
-                    await action(item);
-                }
-
                 return;
                 return;
             }
             }
 
 
-            var list = new List<Task>();
-            foreach (var item in source)
+            list.Add(action(item));
+            if (list.Count >= maxParallelCount)
             {
             {
-                if (cancellationToken.IsCancellationRequested)
-                {
-                    return;
-                }
-
-                list.Add(action(item));
-                if (list.Count >= maxParallelCount)
-                {
-                    await Task.WhenAll(list);
-                    list.Clear();
-                }
+                await Task.WhenAll(list);
+                list.Clear();
             }
             }
-
-            await Task.WhenAll(list);
         }
         }
 
 
-        /// <summary>
-        /// 异步foreach
-        /// </summary>
-        /// <typeparam name="T"></typeparam>
-        /// <param name="source"></param>
-        /// <param name="action"></param>
-        /// <returns></returns>
-        public static Task ForeachAsync<T>(this IEnumerable<T> source, Func<T, Task> action, CancellationToken cancellationToken = default)
-        {
-            return ForeachAsync(source, action, source.Count(), cancellationToken);
-        }
+        await Task.WhenAll(list);
+    }
 
 
-        /// <summary>
-        /// 异步Select
-        /// </summary>
-        /// <typeparam name="T"></typeparam>
-        /// <typeparam name="TResult"></typeparam>
-        /// <param name="source"></param>
-        /// <param name="selector"></param>
-        /// <returns></returns>
-        public static Task<TResult[]> SelectAsync<T, TResult>(this IEnumerable<T> source, Func<T, Task<TResult>> selector)
-        {
-            return Task.WhenAll(source.Select(selector));
-        }
+    /// <summary>
+    /// 异步foreach
+    /// </summary>
+    /// <typeparam name="T"></typeparam>
+    /// <param name="source"></param>
+    /// <param name="action"></param>
+    /// <returns></returns>
+    public static Task ForeachAsync<T>(this IEnumerable<T> source, Func<T, Task> action, CancellationToken cancellationToken = default)
+    {
+        return ForeachAsync(source, action, source.Count(), cancellationToken);
+    }
 
 
-        /// <summary>
-        /// 异步Select
-        /// </summary>
-        /// <typeparam name="T"></typeparam>
-        /// <typeparam name="TResult"></typeparam>
-        /// <param name="source"></param>
-        /// <param name="selector"></param>
-        /// <returns></returns>
-        public static Task<TResult[]> SelectAsync<T, TResult>(this IEnumerable<T> source, Func<T, int, Task<TResult>> selector)
+    /// <summary>
+    /// 异步Select
+    /// </summary>
+    /// <typeparam name="T"></typeparam>
+    /// <typeparam name="TResult"></typeparam>
+    /// <param name="source"></param>
+    /// <param name="selector"></param>
+    /// <returns></returns>
+    public static Task<TResult[]> SelectAsync<T, TResult>(this IEnumerable<T> source, Func<T, Task<TResult>> selector)
+    {
+        return Task.WhenAll(source.Select(selector));
+    }
+
+    /// <summary>
+    /// 异步Select
+    /// </summary>
+    /// <typeparam name="T"></typeparam>
+    /// <typeparam name="TResult"></typeparam>
+    /// <param name="source"></param>
+    /// <param name="selector"></param>
+    /// <returns></returns>
+    public static Task<TResult[]> SelectAsync<T, TResult>(this IEnumerable<T> source, Func<T, int, Task<TResult>> selector)
+    {
+        return Task.WhenAll(source.Select(selector));
+    }
+
+    /// <summary>
+    /// 异步Select
+    /// </summary>
+    /// <typeparam name="T"></typeparam>
+    /// <typeparam name="TResult"></typeparam>
+    /// <param name="source"></param>
+    /// <param name="selector"></param>
+    /// <param name="maxParallelCount">最大并行数</param>
+    /// <returns></returns>
+    public static async Task<List<TResult>> SelectAsync<T, TResult>(this IEnumerable<T> source, Func<T, Task<TResult>> selector, int maxParallelCount)
+    {
+        var results = new List<TResult>();
+        var tasks = new List<Task<TResult>>();
+        foreach (var item in source)
         {
         {
-            return Task.WhenAll(source.Select(selector));
+            var task = selector(item);
+            tasks.Add(task);
+            if (tasks.Count >= maxParallelCount)
+            {
+                results.AddRange(await Task.WhenAll(tasks));
+                tasks.Clear();
+            }
         }
         }
 
 
-        /// <summary>
-        /// 异步Select
-        /// </summary>
-        /// <typeparam name="T"></typeparam>
-        /// <typeparam name="TResult"></typeparam>
-        /// <param name="source"></param>
-        /// <param name="selector"></param>
-        /// <param name="maxParallelCount">最大并行数</param>
-        /// <returns></returns>
-        public static async Task<List<TResult>> SelectAsync<T, TResult>(this IEnumerable<T> source, Func<T, Task<TResult>> selector, int maxParallelCount)
+        results.AddRange(await Task.WhenAll(tasks));
+        return results;
+    }
+
+    /// <summary>
+    /// 异步Select
+    /// </summary>
+    /// <typeparam name="T"></typeparam>
+    /// <typeparam name="TResult"></typeparam>
+    /// <param name="source"></param>
+    /// <param name="selector"></param>
+    /// <param name="maxParallelCount">最大并行数</param>
+    /// <returns></returns>
+    public static async Task<List<TResult>> SelectAsync<T, TResult>(this IEnumerable<T> source, Func<T, int, Task<TResult>> selector, int maxParallelCount)
+    {
+        var results = new List<TResult>();
+        var tasks = new List<Task<TResult>>();
+        int index = 0;
+        foreach (var item in source)
         {
         {
-            var results = new List<TResult>();
-            var tasks = new List<Task<TResult>>();
-            foreach (var item in source)
+            var task = selector(item, index++);
+            tasks.Add(task);
+            if (tasks.Count >= maxParallelCount)
             {
             {
-                var task = selector(item);
-                tasks.Add(task);
-                if (tasks.Count >= maxParallelCount)
-                {
-                    results.AddRange(await Task.WhenAll(tasks));
-                    tasks.Clear();
-                }
+                results.AddRange(await Task.WhenAll(tasks));
+                tasks.Clear();
             }
             }
-
-            results.AddRange(await Task.WhenAll(tasks));
-            return results;
         }
         }
 
 
-        /// <summary>
-        /// 异步Select
-        /// </summary>
-        /// <typeparam name="T"></typeparam>
-        /// <typeparam name="TResult"></typeparam>
-        /// <param name="source"></param>
-        /// <param name="selector"></param>
-        /// <param name="maxParallelCount">最大并行数</param>
-        /// <returns></returns>
-        public static async Task<List<TResult>> SelectAsync<T, TResult>(this IEnumerable<T> source, Func<T, int, Task<TResult>> selector, int maxParallelCount)
+        results.AddRange(await Task.WhenAll(tasks));
+        return results;
+    }
+
+    /// <summary>
+    /// 异步For
+    /// </summary>
+    /// <typeparam name="T"></typeparam>
+    /// <param name="source"></param>
+    /// <param name="selector"></param>
+    /// <param name="maxParallelCount">最大并行数</param>
+    /// <param name="cancellationToken">取消口令</param>
+    /// <returns></returns>
+    public static async Task ForAsync<T>(this IEnumerable<T> source, Func<T, int, Task> selector, int maxParallelCount, CancellationToken cancellationToken = default)
+    {
+        int index = 0;
+        if (Debugger.IsAttached)
         {
         {
-            var results = new List<TResult>();
-            var tasks = new List<Task<TResult>>();
-            int index = 0;
             foreach (var item in source)
             foreach (var item in source)
             {
             {
-                var task = selector(item, index++);
-                tasks.Add(task);
-                if (tasks.Count >= maxParallelCount)
-                {
-                    results.AddRange(await Task.WhenAll(tasks));
-                    tasks.Clear();
-                }
+                await selector(item, index);
+                index++;
             }
             }
 
 
-            results.AddRange(await Task.WhenAll(tasks));
-            return results;
+            return;
         }
         }
 
 
-        /// <summary>
-        /// 异步For
-        /// </summary>
-        /// <typeparam name="T"></typeparam>
-        /// <param name="source"></param>
-        /// <param name="selector"></param>
-        /// <param name="maxParallelCount">最大并行数</param>
-        /// <param name="cancellationToken">取消口令</param>
-        /// <returns></returns>
-        public static async Task ForAsync<T>(this IEnumerable<T> source, Func<T, int, Task> selector, int maxParallelCount, CancellationToken cancellationToken = default)
+        var list = new List<Task>();
+        foreach (var item in source)
         {
         {
-            int index = 0;
-            if (Debugger.IsAttached)
+            if (cancellationToken.IsCancellationRequested)
             {
             {
-                foreach (var item in source)
-                {
-                    await selector(item, index);
-                    index++;
-                }
-
                 return;
                 return;
             }
             }
 
 
-            var list = new List<Task>();
-            foreach (var item in source)
+            list.Add(selector(item, index));
+            Interlocked.Add(ref index, 1);
+            if (list.Count >= maxParallelCount)
             {
             {
-                if (cancellationToken.IsCancellationRequested)
-                {
-                    return;
-                }
-
-                list.Add(selector(item, index));
-                Interlocked.Add(ref index, 1);
-                if (list.Count >= maxParallelCount)
-                {
-                    await Task.WhenAll(list);
-                    list.Clear();
-                }
+                await Task.WhenAll(list);
+                list.Clear();
             }
             }
-
-            await Task.WhenAll(list);
         }
         }
 
 
-        /// <summary>
-        /// 异步For
-        /// </summary>
-        /// <typeparam name="T"></typeparam>
-        /// <param name="source"></param>
-        /// <param name="selector"></param>
-        /// <param name="cancellationToken">取消口令</param>
-        /// <returns></returns>
-        public static Task ForAsync<T>(this IEnumerable<T> source, Func<T, int, Task> selector, CancellationToken cancellationToken = default)
-        {
-            return ForAsync(source, selector, source.Count(), cancellationToken);
-        }
-
-        /// <summary>
-        /// 取最大值
-        /// </summary>
-        /// <typeparam name="TSource"></typeparam>
-        /// <typeparam name="TResult"></typeparam>
-        /// <param name="source"></param>
-        /// <param name="selector"></param>
-        /// <returns></returns>
-        public static TResult MaxOrDefault<TSource, TResult>(this IQueryable<TSource> source, Expression<Func<TSource, TResult>> selector) => source.Select(selector).DefaultIfEmpty().Max();
-
-        /// <summary>
-        /// 取最大值
-        /// </summary>
-        /// <typeparam name="TSource"></typeparam>
-        /// <typeparam name="TResult"></typeparam>
-        /// <param name="source"></param>
-        /// <param name="selector"></param>
-        /// <param name="defaultValue"></param>
-        /// <returns></returns>
-        public static TResult MaxOrDefault<TSource, TResult>(this IQueryable<TSource> source, Expression<Func<TSource, TResult>> selector, TResult defaultValue) => source.Select(selector).DefaultIfEmpty(defaultValue).Max();
-
-        /// <summary>
-        /// 取最大值
-        /// </summary>
-        /// <typeparam name="TSource"></typeparam>
-        /// <param name="source"></param>
-        /// <returns></returns>
-        public static TSource MaxOrDefault<TSource>(this IQueryable<TSource> source) => source.DefaultIfEmpty().Max();
-
-        /// <summary>
-        /// 取最大值
-        /// </summary>
-        /// <typeparam name="TSource"></typeparam>
-        /// <param name="source"></param>
-        /// <param name="defaultValue"></param>
-        /// <returns></returns>
-        public static TSource MaxOrDefault<TSource>(this IQueryable<TSource> source, TSource defaultValue) => source.DefaultIfEmpty(defaultValue).Max();
-
-        /// <summary>
-        /// 取最大值
-        /// </summary>
-        /// <typeparam name="TSource"></typeparam>
-        /// <typeparam name="TResult"></typeparam>
-        /// <param name="source"></param>
-        /// <param name="selector"></param>
-        /// <param name="defaultValue"></param>
-        /// <returns></returns>
-        public static TResult MaxOrDefault<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector, TResult defaultValue) => source.Select(selector).DefaultIfEmpty(defaultValue).Max();
-
-        /// <summary>
-        /// 取最大值
-        /// </summary>
-        /// <typeparam name="TSource"></typeparam>
-        /// <typeparam name="TResult"></typeparam>
-        /// <param name="source"></param>
-        /// <param name="selector"></param>
-        /// <returns></returns>
-        public static TResult MaxOrDefault<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector) => source.Select(selector).DefaultIfEmpty().Max();
-
-        /// <summary>
-        /// 取最大值
-        /// </summary>
-        /// <typeparam name="TSource"></typeparam>
-        /// <param name="source"></param>
-        /// <returns></returns>
-        public static TSource MaxOrDefault<TSource>(this IEnumerable<TSource> source) => source.DefaultIfEmpty().Max();
-
-        /// <summary>
-        /// 取最大值
-        /// </summary>
-        /// <typeparam name="TSource"></typeparam>
-        /// <param name="source"></param>
-        /// <param name="defaultValue"></param>
-        /// <returns></returns>
-        public static TSource MaxOrDefault<TSource>(this IEnumerable<TSource> source, TSource defaultValue) => source.DefaultIfEmpty(defaultValue).Max();
-
-        /// <summary>
-        /// 取最小值
-        /// </summary>
-        /// <typeparam name="TSource"></typeparam>
-        /// <typeparam name="TResult"></typeparam>
-        /// <param name="source"></param>
-        /// <param name="selector"></param>
-        /// <returns></returns>
-        public static TResult MinOrDefault<TSource, TResult>(this IQueryable<TSource> source, Expression<Func<TSource, TResult>> selector) => source.Select(selector).DefaultIfEmpty().Min();
-
-        /// <summary>
-        /// 取最小值
-        /// </summary>
-        /// <typeparam name="TSource"></typeparam>
-        /// <typeparam name="TResult"></typeparam>
-        /// <param name="source"></param>
-        /// <param name="selector"></param>
-        /// <param name="defaultValue"></param>
-        /// <returns></returns>
-        public static TResult MinOrDefault<TSource, TResult>(this IQueryable<TSource> source, Expression<Func<TSource, TResult>> selector, TResult defaultValue) => source.Select(selector).DefaultIfEmpty(defaultValue).Min();
-
-        /// <summary>
-        /// 取最小值
-        /// </summary>
-        /// <typeparam name="TSource"></typeparam>
-        /// <param name="source"></param>
-        /// <returns></returns>
-        public static TSource MinOrDefault<TSource>(this IQueryable<TSource> source) => source.DefaultIfEmpty().Min();
-
-        /// <summary>
-        /// 取最小值
-        /// </summary>
-        /// <typeparam name="TSource"></typeparam>
-        /// <param name="source"></param>
-        /// <param name="defaultValue"></param>
-        /// <returns></returns>
-        public static TSource MinOrDefault<TSource>(this IQueryable<TSource> source, TSource defaultValue) => source.DefaultIfEmpty(defaultValue).Min();
-
-        /// <summary>
-        /// 取最小值
-        /// </summary>
-        /// <typeparam name="TSource"></typeparam>
-        /// <typeparam name="TResult"></typeparam>
-        /// <param name="source"></param>
-        /// <param name="selector"></param>
-        /// <returns></returns>
-        public static TResult MinOrDefault<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector) => source.Select(selector).DefaultIfEmpty().Min();
-
-        /// <summary>
-        /// 取最小值
-        /// </summary>
-        /// <typeparam name="TSource"></typeparam>
-        /// <typeparam name="TResult"></typeparam>
-        /// <param name="source"></param>
-        /// <param name="selector"></param>
-        /// <param name="defaultValue"></param>
-        /// <returns></returns>
-        public static TResult MinOrDefault<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector, TResult defaultValue) => source.Select(selector).DefaultIfEmpty(defaultValue).Min();
-
-        /// <summary>
-        /// 取最小值
-        /// </summary>
-        /// <typeparam name="TSource"></typeparam>
-        /// <param name="source"></param>
-        /// <returns></returns>
-        public static TSource MinOrDefault<TSource>(this IEnumerable<TSource> source) => source.DefaultIfEmpty().Min();
-
-        /// <summary>
-        /// 取最小值
-        /// </summary>
-        /// <typeparam name="TSource"></typeparam>
-        /// <param name="source"></param>
-        /// <param name="defaultValue"></param>
-        /// <returns></returns>
-        public static TSource MinOrDefault<TSource>(this IEnumerable<TSource> source, TSource defaultValue) => source.DefaultIfEmpty(defaultValue).Min();
-
-        /// <summary>
-        /// 标准差
-        /// </summary>
-        /// <typeparam name="T"></typeparam>
-        /// <param name="source"></param>
-        /// <param name="selector"></param>
-        /// <returns></returns>
-        public static TResult StandardDeviation<T, TResult>(this IEnumerable<T> source, Func<T, TResult> selector) where TResult : IConvertible
-        {
-            return StandardDeviation(source.Select(t => selector(t).ConvertTo<double>())).ConvertTo<TResult>();
-        }
+        await Task.WhenAll(list);
+    }
 
 
-        /// <summary>
-        /// 标准差
-        /// </summary>
-        /// <typeparam name="T"></typeparam>
-        /// <param name="source"></param>
-        /// <returns></returns>
-        public static T StandardDeviation<T>(this IEnumerable<T> source) where T : IConvertible
-        {
-            return StandardDeviation(source.Select(t => t.ConvertTo<double>())).ConvertTo<T>();
-        }
+    /// <summary>
+    /// 异步For
+    /// </summary>
+    /// <typeparam name="T"></typeparam>
+    /// <param name="source"></param>
+    /// <param name="selector"></param>
+    /// <param name="cancellationToken">取消口令</param>
+    /// <returns></returns>
+    public static Task ForAsync<T>(this IEnumerable<T> source, Func<T, int, Task> selector, CancellationToken cancellationToken = default)
+    {
+        return ForAsync(source, selector, source.Count(), cancellationToken);
+    }
 
 
-        /// <summary>
-        /// 标准差
-        /// </summary>
-        /// <param name="source"></param>
-        /// <returns></returns>
-        public static double StandardDeviation(this IEnumerable<double> source)
-        {
-            double result = 0;
-            int count = source.Count();
-            if (count > 1)
-            {
-                double avg = source.Average();
-                double sum = source.Sum(d => (d - avg) * (d - avg));
-                result = Math.Sqrt(sum / count);
-            }
+    /// <summary>
+    /// 取最大值
+    /// </summary>
+    /// <typeparam name="TSource"></typeparam>
+    /// <typeparam name="TResult"></typeparam>
+    /// <param name="source"></param>
+    /// <param name="selector"></param>
+    /// <returns></returns>
+    public static TResult MaxOrDefault<TSource, TResult>(this IQueryable<TSource> source, Expression<Func<TSource, TResult>> selector) => source.Select(selector).DefaultIfEmpty().Max();
+
+    /// <summary>
+    /// 取最大值
+    /// </summary>
+    /// <typeparam name="TSource"></typeparam>
+    /// <typeparam name="TResult"></typeparam>
+    /// <param name="source"></param>
+    /// <param name="selector"></param>
+    /// <param name="defaultValue"></param>
+    /// <returns></returns>
+    public static TResult MaxOrDefault<TSource, TResult>(this IQueryable<TSource> source, Expression<Func<TSource, TResult>> selector, TResult defaultValue) => source.Select(selector).DefaultIfEmpty(defaultValue).Max();
+
+    /// <summary>
+    /// 取最大值
+    /// </summary>
+    /// <typeparam name="TSource"></typeparam>
+    /// <param name="source"></param>
+    /// <returns></returns>
+    public static TSource MaxOrDefault<TSource>(this IQueryable<TSource> source) => source.DefaultIfEmpty().Max();
+
+    /// <summary>
+    /// 取最大值
+    /// </summary>
+    /// <typeparam name="TSource"></typeparam>
+    /// <param name="source"></param>
+    /// <param name="defaultValue"></param>
+    /// <returns></returns>
+    public static TSource MaxOrDefault<TSource>(this IQueryable<TSource> source, TSource defaultValue) => source.DefaultIfEmpty(defaultValue).Max();
+
+    /// <summary>
+    /// 取最大值
+    /// </summary>
+    /// <typeparam name="TSource"></typeparam>
+    /// <typeparam name="TResult"></typeparam>
+    /// <param name="source"></param>
+    /// <param name="selector"></param>
+    /// <param name="defaultValue"></param>
+    /// <returns></returns>
+    public static TResult MaxOrDefault<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector, TResult defaultValue) => source.Select(selector).DefaultIfEmpty(defaultValue).Max();
+
+    /// <summary>
+    /// 取最大值
+    /// </summary>
+    /// <typeparam name="TSource"></typeparam>
+    /// <typeparam name="TResult"></typeparam>
+    /// <param name="source"></param>
+    /// <param name="selector"></param>
+    /// <returns></returns>
+    public static TResult MaxOrDefault<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector) => source.Select(selector).DefaultIfEmpty().Max();
+
+    /// <summary>
+    /// 取最大值
+    /// </summary>
+    /// <typeparam name="TSource"></typeparam>
+    /// <param name="source"></param>
+    /// <returns></returns>
+    public static TSource MaxOrDefault<TSource>(this IEnumerable<TSource> source) => source.DefaultIfEmpty().Max();
+
+    /// <summary>
+    /// 取最大值
+    /// </summary>
+    /// <typeparam name="TSource"></typeparam>
+    /// <param name="source"></param>
+    /// <param name="defaultValue"></param>
+    /// <returns></returns>
+    public static TSource MaxOrDefault<TSource>(this IEnumerable<TSource> source, TSource defaultValue) => source.DefaultIfEmpty(defaultValue).Max();
+
+    /// <summary>
+    /// 取最小值
+    /// </summary>
+    /// <typeparam name="TSource"></typeparam>
+    /// <typeparam name="TResult"></typeparam>
+    /// <param name="source"></param>
+    /// <param name="selector"></param>
+    /// <returns></returns>
+    public static TResult MinOrDefault<TSource, TResult>(this IQueryable<TSource> source, Expression<Func<TSource, TResult>> selector) => source.Select(selector).DefaultIfEmpty().Min();
+
+    /// <summary>
+    /// 取最小值
+    /// </summary>
+    /// <typeparam name="TSource"></typeparam>
+    /// <typeparam name="TResult"></typeparam>
+    /// <param name="source"></param>
+    /// <param name="selector"></param>
+    /// <param name="defaultValue"></param>
+    /// <returns></returns>
+    public static TResult MinOrDefault<TSource, TResult>(this IQueryable<TSource> source, Expression<Func<TSource, TResult>> selector, TResult defaultValue) => source.Select(selector).DefaultIfEmpty(defaultValue).Min();
+
+    /// <summary>
+    /// 取最小值
+    /// </summary>
+    /// <typeparam name="TSource"></typeparam>
+    /// <param name="source"></param>
+    /// <returns></returns>
+    public static TSource MinOrDefault<TSource>(this IQueryable<TSource> source) => source.DefaultIfEmpty().Min();
+
+    /// <summary>
+    /// 取最小值
+    /// </summary>
+    /// <typeparam name="TSource"></typeparam>
+    /// <param name="source"></param>
+    /// <param name="defaultValue"></param>
+    /// <returns></returns>
+    public static TSource MinOrDefault<TSource>(this IQueryable<TSource> source, TSource defaultValue) => source.DefaultIfEmpty(defaultValue).Min();
+
+    /// <summary>
+    /// 取最小值
+    /// </summary>
+    /// <typeparam name="TSource"></typeparam>
+    /// <typeparam name="TResult"></typeparam>
+    /// <param name="source"></param>
+    /// <param name="selector"></param>
+    /// <returns></returns>
+    public static TResult MinOrDefault<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector) => source.Select(selector).DefaultIfEmpty().Min();
+
+    /// <summary>
+    /// 取最小值
+    /// </summary>
+    /// <typeparam name="TSource"></typeparam>
+    /// <typeparam name="TResult"></typeparam>
+    /// <param name="source"></param>
+    /// <param name="selector"></param>
+    /// <param name="defaultValue"></param>
+    /// <returns></returns>
+    public static TResult MinOrDefault<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector, TResult defaultValue) => source.Select(selector).DefaultIfEmpty(defaultValue).Min();
+
+    /// <summary>
+    /// 取最小值
+    /// </summary>
+    /// <typeparam name="TSource"></typeparam>
+    /// <param name="source"></param>
+    /// <returns></returns>
+    public static TSource MinOrDefault<TSource>(this IEnumerable<TSource> source) => source.DefaultIfEmpty().Min();
+
+    /// <summary>
+    /// 取最小值
+    /// </summary>
+    /// <typeparam name="TSource"></typeparam>
+    /// <param name="source"></param>
+    /// <param name="defaultValue"></param>
+    /// <returns></returns>
+    public static TSource MinOrDefault<TSource>(this IEnumerable<TSource> source, TSource defaultValue) => source.DefaultIfEmpty(defaultValue).Min();
+
+    /// <summary>
+    /// 标准差
+    /// </summary>
+    /// <typeparam name="T"></typeparam>
+    /// <param name="source"></param>
+    /// <param name="selector"></param>
+    /// <returns></returns>
+    public static TResult StandardDeviation<T, TResult>(this IEnumerable<T> source, Func<T, TResult> selector) where TResult : IConvertible
+    {
+        return StandardDeviation(source.Select(t => selector(t).ConvertTo<double>())).ConvertTo<TResult>();
+    }
 
 
-            return result;
-        }
+    /// <summary>
+    /// 标准差
+    /// </summary>
+    /// <typeparam name="T"></typeparam>
+    /// <param name="source"></param>
+    /// <returns></returns>
+    public static T StandardDeviation<T>(this IEnumerable<T> source) where T : IConvertible
+    {
+        return StandardDeviation(source.Select(t => t.ConvertTo<double>())).ConvertTo<T>();
+    }
 
 
-        /// <summary>
-        /// 随机排序
-        /// </summary>
-        /// <typeparam name="T"></typeparam>
-        /// <param name="source"></param>
-        /// <returns></returns>
-        public static IOrderedEnumerable<T> OrderByRandom<T>(this IEnumerable<T> source)
+    /// <summary>
+    /// 标准差
+    /// </summary>
+    /// <param name="source"></param>
+    /// <returns></returns>
+    public static double StandardDeviation(this IEnumerable<double> source)
+    {
+        double result = 0;
+        int count = source.Count();
+        if (count > 1)
         {
         {
-            return source.OrderBy(_ => Guid.NewGuid());
+            double avg = source.Average();
+            double sum = source.Sum(d => (d - avg) * (d - avg));
+            result = Math.Sqrt(sum / count);
         }
         }
 
 
-        /// <summary>
-        /// 序列相等
-        /// </summary>
-        /// <typeparam name="T"></typeparam>
-        /// <param name="first"></param>
-        /// <param name="second"></param>
-        /// <param name="condition"></param>
-        /// <returns></returns>
-        public static bool SequenceEqual<T>(this IEnumerable<T> first, IEnumerable<T> second, Func<T, T, bool> condition)
+        return result;
+    }
+
+    /// <summary>
+    /// 随机排序
+    /// </summary>
+    /// <typeparam name="T"></typeparam>
+    /// <param name="source"></param>
+    /// <returns></returns>
+    public static IOrderedEnumerable<T> OrderByRandom<T>(this IEnumerable<T> source)
+    {
+        return source.OrderBy(_ => Guid.NewGuid());
+    }
+
+    /// <summary>
+    /// 序列相等
+    /// </summary>
+    /// <typeparam name="T"></typeparam>
+    /// <param name="first"></param>
+    /// <param name="second"></param>
+    /// <param name="condition"></param>
+    /// <returns></returns>
+    public static bool SequenceEqual<T>(this IEnumerable<T> first, IEnumerable<T> second, Func<T, T, bool> condition)
+    {
+        if (first is ICollection<T> source1 && second is ICollection<T> source2)
         {
         {
-            if (first is ICollection<T> source1 && second is ICollection<T> source2)
+            if (source1.Count != source2.Count)
             {
             {
-                if (source1.Count != source2.Count)
-                {
-                    return false;
-                }
+                return false;
+            }
 
 
-                if (source1 is IList<T> list1 && source2 is IList<T> list2)
+            if (source1 is IList<T> list1 && source2 is IList<T> list2)
+            {
+                int count = source1.Count;
+                for (int index = 0; index < count; ++index)
                 {
                 {
-                    int count = source1.Count;
-                    for (int index = 0; index < count; ++index)
+                    if (!condition(list1[index], list2[index]))
                     {
                     {
-                        if (!condition(list1[index], list2[index]))
-                        {
-                            return false;
-                        }
+                        return false;
                     }
                     }
-
-                    return true;
                 }
                 }
+
+                return true;
             }
             }
+        }
 
 
-            using IEnumerator<T> enumerator1 = first.GetEnumerator();
-            using IEnumerator<T> enumerator2 = second.GetEnumerator();
-            while (enumerator1.MoveNext())
+        using IEnumerator<T> enumerator1 = first.GetEnumerator();
+        using IEnumerator<T> enumerator2 = second.GetEnumerator();
+        while (enumerator1.MoveNext())
+        {
+            if (!enumerator2.MoveNext() || !condition(enumerator1.Current, enumerator2.Current))
             {
             {
-                if (!enumerator2.MoveNext() || !condition(enumerator1.Current, enumerator2.Current))
-                {
-                    return false;
-                }
+                return false;
             }
             }
-
-            return !enumerator2.MoveNext();
         }
         }
 
 
-        /// <summary>
-        /// 序列相等
-        /// </summary>
-        /// <typeparam name="T1"></typeparam>
-        /// <typeparam name="T2"></typeparam>
-        /// <param name="first"></param>
-        /// <param name="second"></param>
-        /// <param name="condition"></param>
-        /// <returns></returns>
-        public static bool SequenceEqual<T1, T2>(this IEnumerable<T1> first, IEnumerable<T2> second, Func<T1, T2, bool> condition)
+        return !enumerator2.MoveNext();
+    }
+
+    /// <summary>
+    /// 序列相等
+    /// </summary>
+    /// <typeparam name="T1"></typeparam>
+    /// <typeparam name="T2"></typeparam>
+    /// <param name="first"></param>
+    /// <param name="second"></param>
+    /// <param name="condition"></param>
+    /// <returns></returns>
+    public static bool SequenceEqual<T1, T2>(this IEnumerable<T1> first, IEnumerable<T2> second, Func<T1, T2, bool> condition)
+    {
+        if (first is ICollection<T1> source1 && second is ICollection<T2> source2)
         {
         {
-            if (first is ICollection<T1> source1 && second is ICollection<T2> source2)
+            if (source1.Count != source2.Count)
             {
             {
-                if (source1.Count != source2.Count)
-                {
-                    return false;
-                }
+                return false;
+            }
 
 
-                if (source1 is IList<T1> list1 && source2 is IList<T2> list2)
+            if (source1 is IList<T1> list1 && source2 is IList<T2> list2)
+            {
+                int count = source1.Count;
+                for (int index = 0; index < count; ++index)
                 {
                 {
-                    int count = source1.Count;
-                    for (int index = 0; index < count; ++index)
+                    if (!condition(list1[index], list2[index]))
                     {
                     {
-                        if (!condition(list1[index], list2[index]))
-                        {
-                            return false;
-                        }
+                        return false;
                     }
                     }
-
-                    return true;
                 }
                 }
-            }
 
 
-            using IEnumerator<T1> enumerator1 = first.GetEnumerator();
-            using IEnumerator<T2> enumerator2 = second.GetEnumerator();
-            while (enumerator1.MoveNext())
-            {
-                if (!enumerator2.MoveNext() || !condition(enumerator1.Current, enumerator2.Current))
-                {
-                    return false;
-                }
+                return true;
             }
             }
-
-            return !enumerator2.MoveNext();
         }
         }
 
 
-        /// <summary>
-        /// 对比两个集合哪些是新增的、删除的、修改的
-        /// </summary>
-        /// <typeparam name="T1"></typeparam>
-        /// <typeparam name="T2"></typeparam>
-        /// <param name="first"></param>
-        /// <param name="second"></param>
-        /// <param name="condition">对比因素条件</param>
-        /// <returns></returns>
-        public static (List<T1> adds, List<T2> remove, List<T1> updates) CompareChanges<T1, T2>(this IEnumerable<T1> first, IEnumerable<T2> second, Func<T1, T2, bool> condition)
+        using IEnumerator<T1> enumerator1 = first.GetEnumerator();
+        using IEnumerator<T2> enumerator2 = second.GetEnumerator();
+        while (enumerator1.MoveNext())
         {
         {
-            var add = first.ExceptBy(second, condition).ToList();
-            var remove = second.ExceptBy(first, (s, f) => condition(f, s)).ToList();
-            var update = first.IntersectBy(second, condition).ToList();
-            return (add, remove, update);
+            if (!enumerator2.MoveNext() || !condition(enumerator1.Current, enumerator2.Current))
+            {
+                return false;
+            }
         }
         }
 
 
-        /// <summary>
-        /// 对比两个集合哪些是新增的、删除的、修改的
-        /// </summary>
-        /// <typeparam name="T1"></typeparam>
-        /// <typeparam name="T2"></typeparam>
-        /// <param name="first"></param>
-        /// <param name="second"></param>
-        /// <param name="condition">对比因素条件</param>
-        /// <returns></returns>
-        public static (List<T1> adds, List<T2> remove, List<(T1 first, T2 second)> updates) CompareChangesPlus<T1, T2>(this IEnumerable<T1> first, IEnumerable<T2> second, Func<T1, T2, bool> condition)
-        {
-            var add = first.ExceptBy(second, condition).ToList();
-            var remove = second.ExceptBy(first, (s, f) => condition(f, s)).ToList();
-            var updates = first.IntersectBy(second, condition).Select(t1 => (t1, second.FirstOrDefault(t2 => condition(t1, t2)))).ToList();
-            return (add, remove, updates);
-        }
+        return !enumerator2.MoveNext();
+    }
 
 
-        /// <summary>
-        /// 将集合声明为非null集合
-        /// </summary>
-        /// <typeparam name="T"></typeparam>
-        /// <param name="list"></param>
-        /// <returns></returns>
-        public static List<T> AsNotNull<T>(this List<T> list)
-        {
-            return list ?? new List<T>();
-        }
+    /// <summary>
+    /// 对比两个集合哪些是新增的、删除的、修改的
+    /// </summary>
+    /// <typeparam name="T1"></typeparam>
+    /// <typeparam name="T2"></typeparam>
+    /// <param name="first"></param>
+    /// <param name="second"></param>
+    /// <param name="condition">对比因素条件</param>
+    /// <returns></returns>
+    public static (List<T1> adds, List<T2> remove, List<T1> updates) CompareChanges<T1, T2>(this IEnumerable<T1> first, IEnumerable<T2> second, Func<T1, T2, bool> condition)
+    {
+        first ??= new List<T1>();
+        second ??= new List<T2>();
+        var add = first.ExceptBy(second, condition).ToList();
+        var remove = second.ExceptBy(first, (s, f) => condition(f, s)).ToList();
+        var update = first.IntersectBy(second, condition).ToList();
+        return (add, remove, update);
+    }
 
 
-        /// <summary>
-        /// 将集合声明为非null集合
-        /// </summary>
-        /// <typeparam name="T"></typeparam>
-        /// <param name="list"></param>
-        /// <returns></returns>
-        public static IEnumerable<T> AsNotNull<T>(this IEnumerable<T> list)
-        {
-            return list ?? new List<T>();
-        }
+    /// <summary>
+    /// 对比两个集合哪些是新增的、删除的、修改的
+    /// </summary>
+    /// <typeparam name="T1"></typeparam>
+    /// <typeparam name="T2"></typeparam>
+    /// <param name="first"></param>
+    /// <param name="second"></param>
+    /// <param name="condition">对比因素条件</param>
+    /// <returns></returns>
+    public static (List<T1> adds, List<T2> remove, List<(T1 first, T2 second)> updates) CompareChangesPlus<T1, T2>(this IEnumerable<T1> first, IEnumerable<T2> second, Func<T1, T2, bool> condition)
+    {
+        first ??= new List<T1>();
+        second ??= new List<T2>();
+        var add = first.ExceptBy(second, condition).ToList();
+        var remove = second.ExceptBy(first, (s, f) => condition(f, s)).ToList();
+        var updates = first.IntersectBy(second, condition).Select(t1 => (t1, second.FirstOrDefault(t2 => condition(t1, t2)))).ToList();
+        return (add, remove, updates);
+    }
 
 
-        /// <summary>
-        /// 满足条件时执行筛选条件
-        /// </summary>
-        /// <typeparam name="T"></typeparam>
-        /// <param name="source"></param>
-        /// <param name="condition"></param>
-        /// <param name="where"></param>
-        /// <returns></returns>
-        public static IEnumerable<T> WhereIf<T>(this IEnumerable<T> source, bool condition, Func<T, bool> where)
-        {
-            return condition ? source.Where(where) : source;
-        }
+    /// <summary>
+    /// 将集合声明为非null集合
+    /// </summary>
+    /// <typeparam name="T"></typeparam>
+    /// <param name="list"></param>
+    /// <returns></returns>
+    public static List<T> AsNotNull<T>(this List<T> list)
+    {
+        return list ?? new List<T>();
+    }
 
 
-        /// <summary>
-        /// 满足条件时执行筛选条件
-        /// </summary>
-        /// <typeparam name="T"></typeparam>
-        /// <param name="source"></param>
-        /// <param name="condition"></param>
-        /// <param name="where"></param>
-        /// <returns></returns>
-        public static IEnumerable<T> WhereIf<T>(this IEnumerable<T> source, Func<bool> condition, Func<T, bool> where)
-        {
-            return condition() ? source.Where(where) : source;
-        }
+    /// <summary>
+    /// 将集合声明为非null集合
+    /// </summary>
+    /// <typeparam name="T"></typeparam>
+    /// <param name="list"></param>
+    /// <returns></returns>
+    public static IEnumerable<T> AsNotNull<T>(this IEnumerable<T> list)
+    {
+        return list ?? new List<T>();
+    }
 
 
-        /// <summary>
-        /// 满足条件时执行筛选条件
-        /// </summary>
-        /// <typeparam name="T"></typeparam>
-        /// <param name="source"></param>
-        /// <param name="condition"></param>
-        /// <param name="where"></param>
-        /// <returns></returns>
-        public static IQueryable<T> WhereIf<T>(this IQueryable<T> source, bool condition, Expression<Func<T, bool>> where)
-        {
-            return condition ? source.Where(where) : source;
-        }
+    /// <summary>
+    /// 满足条件时执行筛选条件
+    /// </summary>
+    /// <typeparam name="T"></typeparam>
+    /// <param name="source"></param>
+    /// <param name="condition"></param>
+    /// <param name="where"></param>
+    /// <returns></returns>
+    public static IEnumerable<T> WhereIf<T>(this IEnumerable<T> source, bool condition, Func<T, bool> where)
+    {
+        return condition ? source.Where(where) : source;
+    }
 
 
-        /// <summary>
-        /// 满足条件时执行筛选条件
-        /// </summary>
-        /// <typeparam name="T"></typeparam>
-        /// <param name="source"></param>
-        /// <param name="condition"></param>
-        /// <param name="where"></param>
-        /// <returns></returns>
-        public static IQueryable<T> WhereIf<T>(this IQueryable<T> source, Func<bool> condition, Expression<Func<T, bool>> where)
-        {
-            return condition() ? source.Where(where) : source;
-        }
+    /// <summary>
+    /// 满足条件时执行筛选条件
+    /// </summary>
+    /// <typeparam name="T"></typeparam>
+    /// <param name="source"></param>
+    /// <param name="condition"></param>
+    /// <param name="where"></param>
+    /// <returns></returns>
+    public static IEnumerable<T> WhereIf<T>(this IEnumerable<T> source, Func<bool> condition, Func<T, bool> where)
+    {
+        return condition() ? source.Where(where) : source;
+    }
 
 
-        /// <summary>
-        /// 改变元素的索引位置
-        /// </summary>
-        /// <typeparam name="T"></typeparam>
-        /// <param name="list">集合</param>
-        /// <param name="item">元素</param>
-        /// <param name="index">索引值</param>
-        /// <exception cref="ArgumentNullException"></exception>
-        public static IList<T> ChangeIndex<T>(this IList<T> list, T item, int index)
-        {
-            if (item is null)
-            {
-                throw new ArgumentNullException(nameof(item));
-            }
+    /// <summary>
+    /// 满足条件时执行筛选条件
+    /// </summary>
+    /// <typeparam name="T"></typeparam>
+    /// <param name="source"></param>
+    /// <param name="condition"></param>
+    /// <param name="where"></param>
+    /// <returns></returns>
+    public static IQueryable<T> WhereIf<T>(this IQueryable<T> source, bool condition, Expression<Func<T, bool>> where)
+    {
+        return condition ? source.Where(where) : source;
+    }
 
 
-            ChangeIndexInternal(list, item, index);
-            return list;
-        }
+    /// <summary>
+    /// 满足条件时执行筛选条件
+    /// </summary>
+    /// <typeparam name="T"></typeparam>
+    /// <param name="source"></param>
+    /// <param name="condition"></param>
+    /// <param name="where"></param>
+    /// <returns></returns>
+    public static IQueryable<T> WhereIf<T>(this IQueryable<T> source, Func<bool> condition, Expression<Func<T, bool>> where)
+    {
+        return condition() ? source.Where(where) : source;
+    }
 
 
-        /// <summary>
-        /// 改变元素的索引位置
-        /// </summary>
-        /// <typeparam name="T"></typeparam>
-        /// <param name="list">集合</param>
-        /// <param name="condition">元素定位条件</param>
-        /// <param name="index">索引值</param>
-        public static IList<T> ChangeIndex<T>(this IList<T> list, Func<T, bool> condition, int index)
+    /// <summary>
+    /// 改变元素的索引位置
+    /// </summary>
+    /// <typeparam name="T"></typeparam>
+    /// <param name="list">集合</param>
+    /// <param name="item">元素</param>
+    /// <param name="index">索引值</param>
+    /// <exception cref="ArgumentNullException"></exception>
+    public static IList<T> ChangeIndex<T>(this IList<T> list, T item, int index)
+    {
+        if (item is null)
         {
         {
-            var item = list.FirstOrDefault(condition);
-            if (item != null)
-            {
-                ChangeIndexInternal(list, item, index);
-            }
-            return list;
+            throw new ArgumentNullException(nameof(item));
         }
         }
 
 
-        private static void ChangeIndexInternal<T>(IList<T> list, T item, int index)
+        ChangeIndexInternal(list, item, index);
+        return list;
+    }
+
+    /// <summary>
+    /// 改变元素的索引位置
+    /// </summary>
+    /// <typeparam name="T"></typeparam>
+    /// <param name="list">集合</param>
+    /// <param name="condition">元素定位条件</param>
+    /// <param name="index">索引值</param>
+    public static IList<T> ChangeIndex<T>(this IList<T> list, Func<T, bool> condition, int index)
+    {
+        var item = list.FirstOrDefault(condition);
+        if (item != null)
         {
         {
-            index = Math.Max(0, index);
-            index = Math.Min(list.Count - 1, index);
-            list.Remove(item);
-            list.Insert(index, item);
+            ChangeIndexInternal(list, item, index);
         }
         }
+        return list;
+    }
+
+    private static void ChangeIndexInternal<T>(IList<T> list, T item, int index)
+    {
+        index = Math.Max(0, index);
+        index = Math.Min(list.Count - 1, index);
+        list.Remove(item);
+        list.Insert(index, item);
     }
     }
-}
+}

+ 7 - 2
README.md

@@ -214,13 +214,18 @@ Console.WriteLine(today.DateHoliday);// 获取按公历计算的节假日
 ```csharp
 ```csharp
 Expression<Func<string, bool>> where1 = s => s.StartsWith("a");
 Expression<Func<string, bool>> where1 = s => s.StartsWith("a");
 Expression<Func<string, bool>> where2 = s => s.Length > 10;
 Expression<Func<string, bool>> where2 = s => s.Length > 10;
-Func<string, bool> func = where1.And(where2).Compile();
+Func<string, bool> func = where1.And(where2)
+    .AndIf(!string.IsNullOrEmpty(name),s=>s==name)
+    .Compile(); // And和AndIf可供选择,满足条件再执行And
 bool b=func("abcd12345678");//true
 bool b=func("abcd12345678");//true
 ```
 ```
 ```csharp
 ```csharp
 Expression<Func<string, bool>> where1 = s => s.StartsWith("a");
 Expression<Func<string, bool>> where1 = s => s.StartsWith("a");
 Expression<Func<string, bool>> where2 = s => s.Length > 10;
 Expression<Func<string, bool>> where2 = s => s.Length > 10;
-Func<string, bool> func = where1.Or(where2).Compile();
+Func<string, bool> func = where1
+    .Or(where2)
+    .OrIf(!string.IsNullOrEmpty(name),s=>s==name)
+    .Compile(); // Or和OrIf可供选择,满足条件再执行Or
 bool b=func("abc");// true
 bool b=func("abc");// true
 ```
 ```
 ```csharp
 ```csharp