1
1
Эх сурвалжийг харах

可空字典转换时支持找不到key时生成默认值

懒得勤快 3 жил өмнө
parent
commit
45f8359e5d

+ 156 - 1
Masuit.Tools.Abstractions/Extensions/BaseType/IDictionaryExtensions.cs

@@ -328,7 +328,27 @@ namespace Masuit.Tools
         /// <returns></returns>
         public static NullableDictionary<TKey, TSource> ToDictionarySafety<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
         {
-            var dic = new Dictionary<TKey, TSource>();
+            var dic = new NullableDictionary<TKey, TSource>();
+            foreach (var item in source)
+            {
+                dic[keySelector(item)] = item;
+            }
+
+            return dic;
+        }
+
+        /// <summary>
+        /// 安全的转换成字典集
+        /// </summary>
+        /// <typeparam name="TSource"></typeparam>
+        /// <typeparam name="TKey"></typeparam>
+        /// <param name="source"></param>
+        /// <param name="keySelector">键选择器</param>
+        /// <param name="defaultValue">键未找到时的默认值</param>
+        /// <returns></returns>
+        public static NullableDictionary<TKey, TSource> ToDictionarySafety<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, TSource defaultValue)
+        {
+            var dic = new NullableDictionary<TKey, TSource>() { FallbackValue = defaultValue };
             foreach (var item in source)
             {
                 dic[keySelector(item)] = item;
@@ -358,6 +378,28 @@ namespace Masuit.Tools
             return dic;
         }
 
+        /// <summary>
+        /// 安全的转换成字典集
+        /// </summary>
+        /// <typeparam name="TSource"></typeparam>
+        /// <typeparam name="TKey"></typeparam>
+        /// <typeparam name="TElement"></typeparam>
+        /// <param name="source"></param>
+        /// <param name="keySelector">键选择器</param>
+        /// <param name="elementSelector">值选择器</param>
+        /// <param name="defaultValue">键未找到时的默认值</param>
+        /// <returns></returns>
+        public static NullableDictionary<TKey, TElement> ToDictionarySafety<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, TElement defaultValue)
+        {
+            var dic = new NullableDictionary<TKey, TElement>() { FallbackValue = defaultValue };
+            foreach (var item in source)
+            {
+                dic[keySelector(item)] = elementSelector(item);
+            }
+
+            return dic;
+        }
+
         /// <summary>
         /// 安全的转换成字典集
         /// </summary>
@@ -375,6 +417,24 @@ namespace Masuit.Tools
             return dic;
         }
 
+        /// <summary>
+        /// 安全的转换成字典集
+        /// </summary>
+        /// <typeparam name="TSource"></typeparam>
+        /// <typeparam name="TKey"></typeparam>
+        /// <typeparam name="TElement"></typeparam>
+        /// <param name="source"></param>
+        /// <param name="keySelector">键选择器</param>
+        /// <param name="elementSelector">值选择器</param>
+        /// <param name="defaultValue">键未找到时的默认值</param>
+        /// <returns></returns>
+        public static async Task<NullableConcurrentDictionary<TKey, TElement>> ToDictionarySafetyAsync<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, Task<TElement>> elementSelector, TElement defaultValue)
+        {
+            var dic = new NullableConcurrentDictionary<TKey, TElement>() { FallbackValue = defaultValue };
+            await source.ForeachAsync(async item => dic[keySelector(item)] = await elementSelector(item));
+            return dic;
+        }
+
         /// <summary>
         /// 安全的转换成字典集
         /// </summary>
@@ -395,6 +455,26 @@ namespace Masuit.Tools
             return dic;
         }
 
+        /// <summary>
+        /// 安全的转换成字典集
+        /// </summary>
+        /// <typeparam name="TSource"></typeparam>
+        /// <typeparam name="TKey"></typeparam>
+        /// <param name="source"></param>
+        /// <param name="keySelector">键选择器</param>
+        /// <param name="defaultValue">键未找到时的默认值</param>
+        /// <returns></returns>
+        public static NullableConcurrentDictionary<TKey, TSource> ToConcurrentDictionary<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, TSource defaultValue)
+        {
+            var dic = new NullableConcurrentDictionary<TKey, TSource>() { FallbackValue = defaultValue };
+            foreach (var item in source)
+            {
+                dic[keySelector(item)] = item;
+            }
+
+            return dic;
+        }
+
         /// <summary>
         /// 安全的转换成字典集
         /// </summary>
@@ -416,6 +496,27 @@ namespace Masuit.Tools
             return dic;
         }
 
+        /// <summary>
+        /// 安全的转换成字典集
+        /// </summary>
+        /// <typeparam name="TSource"></typeparam>
+        /// <typeparam name="TKey"></typeparam>
+        /// <typeparam name="TElement"></typeparam>
+        /// <param name="source"></param>
+        /// <param name="keySelector">键选择器</param>
+        /// <param name="elementSelector">值选择器</param>
+        /// <returns></returns>
+        public static NullableConcurrentDictionary<TKey, TElement> ToConcurrentDictionary<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, TElement defaultValue)
+        {
+            var dic = new NullableConcurrentDictionary<TKey, TElement>() { FallbackValue = defaultValue };
+            foreach (var item in source)
+            {
+                dic[keySelector(item)] = elementSelector(item);
+            }
+
+            return dic;
+        }
+
         /// <summary>
         /// 安全的转换成字典集
         /// </summary>
@@ -433,6 +534,24 @@ namespace Masuit.Tools
             return dic;
         }
 
+        /// <summary>
+        /// 安全的转换成字典集
+        /// </summary>
+        /// <typeparam name="TSource"></typeparam>
+        /// <typeparam name="TKey"></typeparam>
+        /// <typeparam name="TElement"></typeparam>
+        /// <param name="source"></param>
+        /// <param name="keySelector">键选择器</param>
+        /// <param name="elementSelector">值选择器</param>
+        /// <param name="defaultValue">键未找到时的默认值</param>
+        /// <returns></returns>
+        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)
+        {
+            var dic = new NullableConcurrentDictionary<TKey, TElement>() { FallbackValue = defaultValue };
+            await source.ForeachAsync(async item => dic[keySelector(item)] = await elementSelector(item));
+            return dic;
+        }
+
         /// <summary>
         /// 转换成并发字典集合
         /// </summary>
@@ -442,6 +561,24 @@ namespace Masuit.Tools
         /// <returns></returns>
         public static NullableConcurrentDictionary<TKey, TValue> AsConcurrentDictionary<TKey, TValue>(this Dictionary<TKey, TValue> dic) => dic;
 
+        /// <summary>
+        /// 转换成并发字典集合
+        /// </summary>
+        /// <typeparam name="TKey"></typeparam>
+        /// <typeparam name="TValue"></typeparam>
+        /// <param name="dic"></param>
+        /// <param name="defaultValue">键未找到时的默认值</param>
+        /// <returns></returns>
+        public static NullableConcurrentDictionary<TKey, TValue> AsConcurrentDictionary<TKey, TValue>(this Dictionary<TKey, TValue> dic, TValue defaultValue)
+        {
+            var nullableDictionary = new NullableConcurrentDictionary<TKey, TValue>() { FallbackValue = defaultValue };
+            foreach (var p in dic)
+            {
+                nullableDictionary[p.Key] = p.Value;
+            }
+            return nullableDictionary;
+        }
+
         /// <summary>
         /// 转换成普通字典集合
         /// </summary>
@@ -450,5 +587,23 @@ namespace Masuit.Tools
         /// <param name="dic"></param>
         /// <returns></returns>
         public static NullableDictionary<TKey, TValue> AsDictionary<TKey, TValue>(this ConcurrentDictionary<TKey, TValue> dic) => dic;
+
+        /// <summary>
+        /// 转换成普通字典集合
+        /// </summary>
+        /// <typeparam name="TKey"></typeparam>
+        /// <typeparam name="TValue"></typeparam>
+        /// <param name="dic"></param>
+        /// <param name="defaultValue">键未找到时的默认值</param>
+        /// <returns></returns>
+        public static NullableDictionary<TKey, TValue> AsDictionary<TKey, TValue>(this ConcurrentDictionary<TKey, TValue> dic, TValue defaultValue)
+        {
+            var nullableDictionary = new NullableDictionary<TKey, TValue>() { FallbackValue = defaultValue };
+            foreach (var p in dic)
+            {
+                nullableDictionary[p.Key] = p.Value;
+            }
+            return nullableDictionary;
+        }
     }
 }

+ 1 - 1
Masuit.Tools.Abstractions/Masuit.Tools.Abstractions.csproj

@@ -4,7 +4,7 @@
     <LangVersion>latest</LangVersion>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <CodeAnalysisRuleSet />
-    <Version>2.4.8.7</Version>
+    <Version>2.4.8.8</Version>
     <Authors>懒得勤快</Authors>
     <Description>Masuit.Tools基础公共库,包含一些常用的操作类,大都是静态类,加密解密,反射操作,Excel简单导出,权重随机筛选算法,分布式短id,表达式树,linq扩展,文件压缩,多线程下载和FTP客户端,硬件信息,字符串扩展方法,日期时间扩展操作,中国农历,大文件拷贝,图像裁剪,验证码,断点续传,集合扩展等常用封装。</Description>
     <Copyright>懒得勤快,长空X</Copyright>

+ 3 - 1
Masuit.Tools.Abstractions/Systems/NullableConcurrentDictionary.cs

@@ -22,9 +22,11 @@ public class NullableConcurrentDictionary<TKey, TValue> : ConcurrentDictionary<N
     {
     }
 
+    internal TValue FallbackValue { get; set; }
+
     public new TValue this[NullObject<TKey> key]
     {
-        get => TryGetValue(key, out var value) ? value : default;
+        get => TryGetValue(key, out var value) ? value : FallbackValue;
         set => base[key] = value;
     }
 

+ 3 - 1
Masuit.Tools.Abstractions/Systems/NullableDictionary.cs

@@ -34,13 +34,15 @@ public class NullableDictionary<TKey, TValue> : Dictionary<NullObject<TKey>, TVa
     {
     }
 
+    internal TValue FallbackValue { get; set; }
+
     /// <summary>
     ///
     /// </summary>
     /// <param name="key"></param>
     public new TValue this[NullObject<TKey> key]
     {
-        get => TryGetValue(key, out var value) ? value : default;
+        get => TryGetValue(key, out var value) ? value : FallbackValue;
         set => base[key] = value;
     }
 

+ 1 - 1
Masuit.Tools.AspNetCore/Masuit.Tools.AspNetCore.csproj

@@ -18,7 +18,7 @@
         <LangVersion>latest</LangVersion>
         <RepositoryType>Github</RepositoryType>
         <GeneratePackageOnBuild>True</GeneratePackageOnBuild>
-        <Version>1.0.5.7</Version>
+        <Version>1.0.5.8</Version>
         <FileVersion>1.0</FileVersion>
         <Company>masuit.com</Company>
         <AssemblyVersion>1.0</AssemblyVersion>

+ 1 - 1
Masuit.Tools.Core/Masuit.Tools.Core.csproj

@@ -18,7 +18,7 @@ github:https://github.com/ldqk/Masuit.Tools
         <UserSecretsId>830c282f-f7c1-42be-8651-4cd06ac8e73f</UserSecretsId>
         <RepositoryType>Github</RepositoryType>
         <GeneratePackageOnBuild>True</GeneratePackageOnBuild>
-        <Version>2.4.8.7</Version>
+        <Version>2.4.8.8</Version>
         <FileVersion>2.4.5.6</FileVersion>
         <Company>masuit.com</Company>
         <AssemblyVersion>2.4.5.6</AssemblyVersion>

+ 1 - 1
Masuit.Tools.Net45/package.nuspec

@@ -4,7 +4,7 @@
     <!--*-->
     <id>Masuit.Tools.Net45</id>
     <!--*-->
-    <version>2.4.8.7</version>
+    <version>2.4.8.8</version>
     <title>Masuit.Tools</title>
     <!--*-->
     <authors>懒得勤快</authors>

+ 1 - 1
Masuit.Tools/package.nuspec

@@ -4,7 +4,7 @@
     <!--*-->
     <id>Masuit.Tools.Net</id>
     <!--*-->
-    <version>2.4.8.7</version>
+    <version>2.4.8.8</version>
     <title>Masuit.Tools</title>
     <!--*-->
     <authors>懒得勤快</authors>