|
@@ -2,6 +2,7 @@
|
|
using System;
|
|
using System;
|
|
using System.Collections.Concurrent;
|
|
using System.Collections.Concurrent;
|
|
using System.Collections.Generic;
|
|
using System.Collections.Generic;
|
|
|
|
+using System.Linq;
|
|
using System.Threading.Tasks;
|
|
using System.Threading.Tasks;
|
|
|
|
|
|
namespace Masuit.Tools
|
|
namespace Masuit.Tools
|
|
@@ -328,7 +329,7 @@ namespace Masuit.Tools
|
|
/// <returns></returns>
|
|
/// <returns></returns>
|
|
public static NullableDictionary<TKey, TSource> ToDictionarySafety<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
|
|
public static NullableDictionary<TKey, TSource> ToDictionarySafety<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
|
|
{
|
|
{
|
|
- var dic = new NullableDictionary<TKey, TSource>();
|
|
|
|
|
|
+ var dic = new NullableDictionary<TKey, TSource>(source.Count());
|
|
foreach (var item in source)
|
|
foreach (var item in source)
|
|
{
|
|
{
|
|
dic[keySelector(item)] = item;
|
|
dic[keySelector(item)] = item;
|
|
@@ -348,7 +349,7 @@ namespace Masuit.Tools
|
|
/// <returns></returns>
|
|
/// <returns></returns>
|
|
public static NullableDictionary<TKey, TSource> ToDictionarySafety<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, TSource defaultValue)
|
|
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 };
|
|
|
|
|
|
+ var dic = new NullableDictionary<TKey, TSource>(source.Count()) { FallbackValue = defaultValue };
|
|
foreach (var item in source)
|
|
foreach (var item in source)
|
|
{
|
|
{
|
|
dic[keySelector(item)] = item;
|
|
dic[keySelector(item)] = item;
|
|
@@ -369,7 +370,7 @@ namespace Masuit.Tools
|
|
/// <returns></returns>
|
|
/// <returns></returns>
|
|
public static NullableDictionary<TKey, TElement> ToDictionarySafety<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector)
|
|
public static NullableDictionary<TKey, TElement> ToDictionarySafety<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector)
|
|
{
|
|
{
|
|
- var dic = new NullableDictionary<TKey, TElement>();
|
|
|
|
|
|
+ var dic = new NullableDictionary<TKey, TElement>(source.Count());
|
|
foreach (var item in source)
|
|
foreach (var item in source)
|
|
{
|
|
{
|
|
dic[keySelector(item)] = elementSelector(item);
|
|
dic[keySelector(item)] = elementSelector(item);
|
|
@@ -391,7 +392,7 @@ namespace Masuit.Tools
|
|
/// <returns></returns>
|
|
/// <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)
|
|
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 };
|
|
|
|
|
|
+ var dic = new NullableDictionary<TKey, TElement>(source.Count()) { FallbackValue = defaultValue };
|
|
foreach (var item in source)
|
|
foreach (var item in source)
|
|
{
|
|
{
|
|
dic[keySelector(item)] = elementSelector(item);
|
|
dic[keySelector(item)] = elementSelector(item);
|
|
@@ -410,9 +411,9 @@ namespace Masuit.Tools
|
|
/// <param name="keySelector">键选择器</param>
|
|
/// <param name="keySelector">键选择器</param>
|
|
/// <param name="elementSelector">值选择器</param>
|
|
/// <param name="elementSelector">值选择器</param>
|
|
/// <returns></returns>
|
|
/// <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)
|
|
|
|
|
|
+ public static async Task<NullableDictionary<TKey, TElement>> ToDictionarySafetyAsync<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, Task<TElement>> elementSelector)
|
|
{
|
|
{
|
|
- var dic = new NullableConcurrentDictionary<TKey, TElement>();
|
|
|
|
|
|
+ var dic = new NullableDictionary<TKey, TElement>(source.Count());
|
|
await source.ForeachAsync(async item => dic[keySelector(item)] = await elementSelector(item));
|
|
await source.ForeachAsync(async item => dic[keySelector(item)] = await elementSelector(item));
|
|
return dic;
|
|
return dic;
|
|
}
|
|
}
|
|
@@ -428,13 +429,52 @@ namespace Masuit.Tools
|
|
/// <param name="elementSelector">值选择器</param>
|
|
/// <param name="elementSelector">值选择器</param>
|
|
/// <param name="defaultValue">键未找到时的默认值</param>
|
|
/// <param name="defaultValue">键未找到时的默认值</param>
|
|
/// <returns></returns>
|
|
/// <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)
|
|
|
|
|
|
+ public static async Task<NullableDictionary<TKey, TElement>> ToDictionarySafetyAsync<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, Task<TElement>> elementSelector, TElement defaultValue)
|
|
{
|
|
{
|
|
- var dic = new NullableConcurrentDictionary<TKey, TElement>() { FallbackValue = defaultValue };
|
|
|
|
|
|
+ var dic = new NullableDictionary<TKey, TElement>(source.Count()) { FallbackValue = defaultValue };
|
|
await source.ForeachAsync(async item => dic[keySelector(item)] = await elementSelector(item));
|
|
await source.ForeachAsync(async item => dic[keySelector(item)] = await elementSelector(item));
|
|
return dic;
|
|
return dic;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /// <summary>
|
|
|
|
+ /// 安全的转换成字典集
|
|
|
|
+ /// </summary>
|
|
|
|
+ /// <typeparam name="TSource"></typeparam>
|
|
|
|
+ /// <typeparam name="TKey"></typeparam>
|
|
|
|
+ /// <param name="source"></param>
|
|
|
|
+ /// <param name="keySelector">键选择器</param>
|
|
|
|
+ /// <returns></returns>
|
|
|
|
+ public static DisposableDictionary<TKey, TSource> ToDisposableDictionarySafety<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector) where TSource : IDisposable
|
|
|
|
+ {
|
|
|
|
+ var dic = new DisposableDictionary<TKey, TSource>(source.Count());
|
|
|
|
+ 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 DisposableDictionary<TKey, TSource> ToDisposableDictionarySafety<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, TSource defaultValue) where TSource : IDisposable
|
|
|
|
+ {
|
|
|
|
+ var dic = new DisposableDictionary<TKey, TSource>(source.Count()) { FallbackValue = defaultValue };
|
|
|
|
+ foreach (var item in source)
|
|
|
|
+ {
|
|
|
|
+ dic[keySelector(item)] = item;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return dic;
|
|
|
|
+ }
|
|
|
|
+
|
|
/// <summary>
|
|
/// <summary>
|
|
/// 安全的转换成字典集
|
|
/// 安全的转换成字典集
|
|
/// </summary>
|
|
/// </summary>
|
|
@@ -443,6 +483,83 @@ namespace Masuit.Tools
|
|
/// <typeparam name="TElement"></typeparam>
|
|
/// <typeparam name="TElement"></typeparam>
|
|
/// <param name="source"></param>
|
|
/// <param name="source"></param>
|
|
/// <param name="keySelector">键选择器</param>
|
|
/// <param name="keySelector">键选择器</param>
|
|
|
|
+ /// <param name="elementSelector">值选择器</param>
|
|
|
|
+ /// <returns></returns>
|
|
|
|
+ public static DisposableDictionary<TKey, TElement> ToDisposableDictionarySafety<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector) where TElement : IDisposable
|
|
|
|
+ {
|
|
|
|
+ var dic = new DisposableDictionary<TKey, TElement>(source.Count());
|
|
|
|
+ foreach (var item in source)
|
|
|
|
+ {
|
|
|
|
+ dic[keySelector(item)] = elementSelector(item);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ 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 DisposableDictionary<TKey, TElement> ToDisposableDictionarySafety<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, TElement defaultValue) where TElement : IDisposable
|
|
|
|
+ {
|
|
|
|
+ var dic = new DisposableDictionary<TKey, TElement>(source.Count()) { FallbackValue = defaultValue };
|
|
|
|
+ foreach (var item in source)
|
|
|
|
+ {
|
|
|
|
+ dic[keySelector(item)] = elementSelector(item);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ 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 async Task<DisposableDictionary<TKey, TElement>> ToDisposableDictionarySafetyAsync<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, Task<TElement>> elementSelector) where TElement : IDisposable
|
|
|
|
+ {
|
|
|
|
+ var dic = new DisposableDictionary<TKey, TElement>(source.Count());
|
|
|
|
+ await source.ForeachAsync(async item => dic[keySelector(item)] = await elementSelector(item));
|
|
|
|
+ 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<DisposableDictionary<TKey, TElement>> ToDisposableDictionarySafetyAsync<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, Task<TElement>> elementSelector, TElement defaultValue) where TElement : IDisposable
|
|
|
|
+ {
|
|
|
|
+ var dic = new DisposableDictionary<TKey, TElement>(source.Count()) { FallbackValue = defaultValue };
|
|
|
|
+ await source.ForeachAsync(async item => dic[keySelector(item)] = await elementSelector(item));
|
|
|
|
+ return dic;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /// <summary>
|
|
|
|
+ /// 安全的转换成字典集
|
|
|
|
+ /// </summary>
|
|
|
|
+ /// <typeparam name="TSource"></typeparam>
|
|
|
|
+ /// <typeparam name="TKey"></typeparam>
|
|
|
|
+ /// <param name="source"></param>
|
|
|
|
+ /// <param name="keySelector">键选择器</param>
|
|
/// <returns></returns>
|
|
/// <returns></returns>
|
|
public static NullableConcurrentDictionary<TKey, TSource> ToConcurrentDictionary<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
|
|
public static NullableConcurrentDictionary<TKey, TSource> ToConcurrentDictionary<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
|
|
{
|
|
{
|
|
@@ -552,6 +669,122 @@ namespace Masuit.Tools
|
|
return dic;
|
|
return dic;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /// <summary>
|
|
|
|
+ /// 安全的转换成字典集
|
|
|
|
+ /// </summary>
|
|
|
|
+ /// <typeparam name="TSource"></typeparam>
|
|
|
|
+ /// <typeparam name="TKey"></typeparam>
|
|
|
|
+ /// <param name="source"></param>
|
|
|
|
+ /// <param name="keySelector">键选择器</param>
|
|
|
|
+ /// <returns></returns>
|
|
|
|
+ public static DisposableConcurrentDictionary<TKey, TSource> ToDisposableConcurrentDictionary<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector) where TSource : IDisposable
|
|
|
|
+ {
|
|
|
|
+ var dic = new DisposableConcurrentDictionary<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 DisposableConcurrentDictionary<TKey, TSource> ToDisposableConcurrentDictionary<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, TSource defaultValue) where TSource : IDisposable
|
|
|
|
+ {
|
|
|
|
+ var dic = new DisposableConcurrentDictionary<TKey, TSource>() { FallbackValue = defaultValue };
|
|
|
|
+ foreach (var item in source)
|
|
|
|
+ {
|
|
|
|
+ dic[keySelector(item)] = item;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ 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 DisposableConcurrentDictionary<TKey, TElement> ToDisposableConcurrentDictionary<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector) where TElement : IDisposable
|
|
|
|
+ {
|
|
|
|
+ var dic = new DisposableConcurrentDictionary<TKey, TElement>();
|
|
|
|
+ foreach (var item in source)
|
|
|
|
+ {
|
|
|
|
+ dic[keySelector(item)] = elementSelector(item);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ 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 DisposableConcurrentDictionary<TKey, TElement> ToDisposableConcurrentDictionary<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, TElement defaultValue) where TElement : IDisposable
|
|
|
|
+ {
|
|
|
|
+ var dic = new DisposableConcurrentDictionary<TKey, TElement>() { FallbackValue = defaultValue };
|
|
|
|
+ foreach (var item in source)
|
|
|
|
+ {
|
|
|
|
+ dic[keySelector(item)] = elementSelector(item);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ 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 async Task<DisposableConcurrentDictionary<TKey, TElement>> ToDisposableConcurrentDictionaryAsync<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, Task<TElement>> elementSelector) where TElement : IDisposable
|
|
|
|
+ {
|
|
|
|
+ var dic = new DisposableConcurrentDictionary<TKey, TElement>();
|
|
|
|
+ await source.ForeachAsync(async item => dic[keySelector(item)] = await elementSelector(item));
|
|
|
|
+ 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<DisposableConcurrentDictionary<TKey, TElement>> ToDisposableConcurrentDictionaryAsync<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, Task<TElement>> elementSelector, TElement defaultValue) where TElement : IDisposable
|
|
|
|
+ {
|
|
|
|
+ var dic = new DisposableConcurrentDictionary<TKey, TElement>() { FallbackValue = defaultValue };
|
|
|
|
+ await source.ForeachAsync(async item => dic[keySelector(item)] = await elementSelector(item));
|
|
|
|
+ return dic;
|
|
|
|
+ }
|
|
|
|
+
|
|
/// <summary>
|
|
/// <summary>
|
|
/// 转换成并发字典集合
|
|
/// 转换成并发字典集合
|
|
/// </summary>
|
|
/// </summary>
|