using JetBrains.Annotations;
using System.Collections;
using System.Text;
namespace DS.Module.Core.Extensions;
public static partial class Extensions
{
///
/// 根据Index下标移除
///
///
///
///
///
public static List Remove(this List list, int index) where T : class, new()
{
list.RemoveAt(index);
return list;
}
///
/// 移除
///
///
///
///
public static List RemoveAll(this List list) where T : class, new()
{
list.NotNullOrEmpty(nameof(list));
for (int i = list.Count - 1; i >= 0; i--)
{
list.RemoveAt(i);
}
return list;
}
/// 串联对象数组的各个元素,其中在每个元素之间使用指定的分隔符。
/// 一个由 的元素组成的字符串,这些元素以 字符串分隔。如果 为空数组,该方法将返回 。
/// 要用作分隔符的字符串。只有在 具有多个元素时, 才包括在返回的字符串中。
/// 一个集合,其中包含要连接的元素。
///
/// 为 null。
public static string ToJoin(this IEnumerable values, string separator = ",")
where TSource : IEnumerable
{
values = values.Where(o => !o.AsTo().IsNullOrEmpty());
return string.Join(separator, values);
}
///
/// 去重
///
/// 去重数据源
/// 键
/// 数据源
/// 键条件
///
public static IEnumerable DistinctBy(this IEnumerable source,
Func keySelector)
{
return source.GroupBy(keySelector).Select(gropby => gropby.First());
}
///
/// 去重
///
/// 去重数据源
/// 键
/// 数据源
/// 键条件
/// 返回去重后集合数据
public static IList ToDistinctBy(this IEnumerable source,
Func keySelector)
{
return source.DistinctBy(keySelector).ToList();
}
///
/// 把集合转成SqlIn
///
/// 源
/// 要转换的值
/// 分割符
/// 左边符
/// 右边符
/// 返回组装好的值,例如"'a','b'"
public static string ToSqlIn(this IEnumerable values, string separator = ",", string left = "'",
string right = "'")
{
StringBuilder sb = new StringBuilder();
var enumerable = values as TSource[] ?? values.ToArray();
if (!enumerable.Any())
{
return string.Empty;
}
enumerable.ToList().ForEach(o => { sb.AppendFormat("{0}{1}{2}{3}", left, o, right, separator); });
string newStr = sb.ToString()?.TrimEnd($"{separator}".ToCharArray());
return newStr;
}
///
/// 根据集合字典转成字典
///
/// 键的类型
/// 值的类型
/// 数据源
/// 返回所需的字典
public static IDictionary AsDictionary(
this IEnumerable> keyValuePairs)
{
keyValuePairs.NotNullOrEmpty(nameof(keyValuePairs));
IDictionary dic = new Dictionary();
foreach (KeyValuePair keys in keyValuePairs)
{
dic.Add(keys.Key, keys.Value);
}
return dic;
}
public static IEnumerable WhereIf(this IEnumerable source, Func predicate,
bool condition) where TSource : IEnumerable
{
source.NotNullOrEmpty(nameof(source));
predicate.NotNull(nameof(predicate));
return condition ? source.Where(predicate) : source;
}
///
/// 给IEnumerable拓展ForEach方法
///
/// 模型类
/// 数据源
/// 方法
public static void ForEach(this IEnumerable iEnumberable, Action func)
{
foreach (var item in iEnumberable)
{
func(item);
}
}
///
/// 给IEnumerable拓展ForEach方法
///
/// 模型类
/// 数据源
/// 方法
public static void ForEach(this IEnumerable iEnumberable, Action func)
{
var array = iEnumberable.ToArray();
for (int i = 0; i < array.Count(); i++)
{
func(array[i], i);
}
}
///
/// 将列表转换为树形结构(泛型无限递归)
///
/// 类型
/// 数据
/// 根条件
/// 节点条件
/// 添加子节点
///
///
public static List ToTree(this List list, Func rootwhere, Func childswhere,
Action> addchilds, T entity = default(T))
{
var treelist = new List();
//空树
if (list == null || list.Count == 0)
{
return treelist;
}
if (!list.Any(e => rootwhere(entity, e)))
{
return treelist;
}
//树根
if (list.Any(e => rootwhere(entity, e)))
{
treelist.AddRange(list.Where(e => rootwhere(entity, e)));
}
//树叶
foreach (var item in treelist)
{
if (list.Any(e => childswhere(item, e)))
{
var nodedata = list.Where(e => childswhere(item, e)).ToList();
foreach (var child in nodedata)
{
//添加子集
var data = list.ToTree(childswhere, childswhere, addchilds, child);
addchilds(child, data);
}
addchilds(item, nodedata);
}
}
return treelist;
}
///
/// 把集合的元素转成指定的类型
///
/// 要转换的类型
/// 转换的数据源
/// 返回转换后的集合
public static IEnumerable AsToAll(this IEnumerable source)
{
source.NotNull(nameof(source));
IEnumerable enumerable = source as IEnumerable;
if (enumerable != null)
{
return enumerable;
}
return CastIterator(source);
}
private static IEnumerable CastIterator(IEnumerable source)
{
foreach (object current in source)
{
yield return (current.AsTo());
}
yield break;
}
public static bool AddIfNotContains([NotNull] this ICollection source, T item)
{
source.NotNull(nameof(source));
if (source.Contains(item))
{
return false;
}
source.Add(item);
return true;
}
}