Files
tnb.server/common/Tnb.CollectiveOAuth/Enums/EnumHelper/ArrayExtensions.cs
2023-03-13 15:00:34 +08:00

229 lines
7.4 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
namespace JNPF.Extras.CollectiveOAuth.Enums;
/// <summary>
/// 数组,队列对象的列表类.
/// </summary>
public static class ArrayExtensions
{
/// <summary>
/// 扩展 Dictionary 根据Value反向查找Key的方法.
/// </summary>
public static T1 Get<T1, T2>(this IEnumerable<KeyValuePair<T1, T2>> list, T2 t2)
{
foreach (KeyValuePair<T1, T2> obj in list)
if (obj.Value.Equals(t2)) return obj.Key;
return default(T1);
}
/// <summary>
/// 扩展数组方法 可以在前或者后插入一个对象.
/// </summary>
/// <typeparam name="T">对象.</typeparam>
/// <param name="list"></param>
/// <param name="obj">要插入的对象.</param>
/// <param name="place">位置 after/before.</param>
/// <returns></returns>
public static IEnumerable<T> Inject<T>(this IEnumerable<T> list, T obj, ArrayInjectPlace place = ArrayInjectPlace.Top)
{
T[] list2 = new T[list.Count() + 1];
int index = 0;
foreach (T t in list)
{
list2[place == ArrayInjectPlace.Bottom ? index : index + 1] = t;
}
list2[place == ArrayInjectPlace.Bottom ? list.Count() : 0] = obj;
return list2;
}
/// <summary>
/// 将数组合并成为一个字符串.
/// </summary>
public static string Join<T>(this IEnumerable<T> list, char? c = ',')
{
return list.Join(c.ToString());
}
public static string Join<T>(this IEnumerable<T> list, string split)
{
return string.Join(split, list);
}
/// <summary>
/// 按指定条件过滤数组.
/// </summary>
/// <param name="ac">默认为过滤重复.</param>
public static IEnumerable<T> Filter<T>(this IEnumerable<T> list, ArrayFilterRule filterRule = ArrayFilterRule.NoRepeater)
{
List<T> list2 = new List<T>();
foreach (T t in list)
{
if (!list2.Contains(t)) list2.Add(t);
}
return list2;
}
/// <summary>
/// 合并数组 并且去除重复项.
/// </summary>
/// <param name="converter">要比较的字段.</param>
public static List<T> Merge<T, TOutput>(this IEnumerable<T> objList, Converter<T, TOutput> converter, params IEnumerable<T>[] objs)
{
List<T> list = objList.ToList();
foreach (var obj in objs)
{
list.AddRange(obj.ToList().FindAll(t => !list.Exists(t1 => converter(t1).Equals(converter(t)))));
}
return list;
}
/// <summary>
/// 获取数组的索引项。 如果超出则返回类型的默认值.
/// </summary>
public static T GetIndex<T>(this IEnumerable<T> list, int index)
{
if (list == null || index >= list.Count() || index < 0) return default(T);
return list.ToArray()[index];
}
/// <summary>
/// 把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串.
/// </summary>
/// <typeparam name="TKey"></typeparam>
/// <typeparam name="TValue"></typeparam>
/// <param name="list"></param>
public static string ToQueryString<TKey, TValue>(this IEnumerable<KeyValuePair<TKey, TValue>> list)
{
return list.ToList().ConvertAll(t => string.Format("{0}={1}", t.Key, t.Value)).Join("&");
}
/// <summary>
/// 除去数组中的空值和指定名称的参数并以字母a到z的顺序排序.
/// </summary>
/// <param name="filter">过滤规则 默认做为空判断</param>
public static IEnumerable<KeyValuePair<TKey, TValue>> Filter<TKey, TValue>(this IEnumerable<KeyValuePair<TKey, TValue>> list, Func<TKey, TValue, bool> filter = null)
{
if (filter == null)
{
filter = (key, value) =>
{
return !string.IsNullOrEmpty(key.ToString()) && value != null;
};
}
foreach (var item in list)
{
if (filter(item.Key, item.Value))
yield return new KeyValuePair<TKey, TValue>(item.Key, item.Value);
}
}
/// <summary>
/// 不包含指定的Key.
/// </summary>
public static IEnumerable<KeyValuePair<TKey, TValue>> Filter<TKey, TValue>(this IEnumerable<KeyValuePair<TKey, TValue>> list, params TKey[] filter)
{
return list.Filter((key, value) =>
{
return !string.IsNullOrEmpty(key.ToString()) && value != null && !filter.Contains(key);
});
}
/// <summary>
/// 按照Key从小大大拍列.
/// </summary>
/// <typeparam name="TKey"></typeparam>
/// <typeparam name="TValue"></typeparam>
/// <param name="list"></param>
public static void Sort<TKey, TValue>(this IEnumerable<KeyValuePair<TKey, TValue>> list)
{
list = list.ToList().OrderBy(t => t.Key);
}
/// <summary>
/// 获取父级的继承树最多支持32级
/// 包括自己.
/// </summary>
/// <typeparam name="TValue">主键类型.</typeparam>
/// <param name="obj">要查找的数组对象</param>
/// <param name="id">当前对象的主键值</param>
/// <param name="value">主键字段</param>
/// <param name="parent">父级字段</param>
/// <returns></returns>
public static List<T> GetParent<T, TValue>(this List<T> obj, TValue id, Func<T, TValue> value, Func<T, TValue> parent)
{
int count = 0;
T t = obj.Find(m => value.Invoke(m).Equals(id));
List<T> list = new List<T>();
while (t != null)
{
if (count > 32) break;
list.Add(t);
t = obj.Find(m => value.Invoke(m).Equals(parent.Invoke(t)));
count++;
}
return list;
}
/// <summary>
/// 获取子集列表(包括自己).
/// </summary>
public static void GetChild<T, TValue>(this List<T> obj, TValue id, Func<T, TValue> value, Func<T, TValue> parent, ref List<T> list)
{
if (list == null) list = new List<T>();
var objT = obj.Find(t => value.Invoke(t).Equals(id));
if (objT != null)
{
list.Add(objT);
foreach (T t in obj.FindAll(m => parent.Invoke(m).Equals(id)))
{
obj.GetChild(value.Invoke(t), value, parent, ref list);
}
}
}
/// <summary>
/// 获取树形结构的子集执行方法.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <typeparam name="TValue"></typeparam>
/// <param name="obj">当前对象</param>
/// <param name="id">当前父节点</param>
/// <param name="value">获取主键的委托</param>
/// <param name="parent">获取父值的委托</param>
/// <param name="action">委托执行的方法 int 为当前的深度</param>
/// <param name="depth">当前的深度</param>
public static void GetTree<T, TValue>(this List<T> obj, TValue id, Func<T, TValue> value, Func<T, TValue> parent, Action<T, int> action, int depth = 0)
{
foreach (T t in obj.FindAll(m => parent.Invoke(m).Equals(id)))
{
action.Invoke(t, depth + 1);
obj.GetTree(value.Invoke(t), value, parent, action, depth + 1);
}
}
}
/// <summary>
/// 数组过滤规则.
/// </summary>
public enum ArrayFilterRule
{
/// <summary>
/// 过滤重复.
/// </summary>
NoRepeater
}
/// <summary>
/// 插入数组的位置.
/// </summary>
public enum ArrayInjectPlace
{
/// <summary>
/// 在顶部插入.
/// </summary>
Top,
/// <summary>
/// 在尾部追加.
/// </summary>
Bottom
}