using System; using System.Collections.Generic; namespace MeloongCore.Extensions { public static class EnumerableExtensions { /// /// 去重。 /// public static List Distinct(this IList Arr, Func IsEqual) { var ResultArray = new List(); for (int i = 0; i <= Arr.Count - 1; i++) { for (int ii = i + 1; ii <= Arr.Count - 1; ii++) { if (IsEqual(Arr[i], Arr[ii])) { goto NextElement; } } ResultArray.Add(Arr[i]); NextElement:; } return ResultArray; } /// /// 判断这是否是仅有一个元素的集合。 /// public static bool IsSingle(this IEnumerable Source) { if (Source == null) { return false; } else if (Source is IList list) { return list.Count == 1; } else { using (var Enumerator = Source.GetEnumerator()) { if (!Enumerator.MoveNext()) { return false; } if (Enumerator.MoveNext()) { return false; } return true; } } } /// /// 对集合的每个元素执行指定操作。 /// public static IEnumerable ForEach(this IEnumerable Collection, Action Action) { foreach (T Item in Collection) { Action(Item); } return Collection; } /// /// 选择所有最大值对应的对象。 /// 若没有元素则返回空列表。 /// public static List MaxByAll(this IEnumerable Source, Func Selector) where C : IComparable { var Results = new List(); using (var Enumerator = Source.GetEnumerator()) { if (!Enumerator.MoveNext()) { return Results; } T MaxItem = Enumerator.Current; C MaxValue = Selector(MaxItem); Results.Add(MaxItem); while (Enumerator.MoveNext()) { T CurrentItem = Enumerator.Current; C CurrentValue = Selector(CurrentItem); int Comparison = CurrentValue.CompareTo(MaxValue); if (Comparison > 0) { MaxValue = CurrentValue; Results.Clear(); Results.Add(CurrentItem); } else if (Comparison == 0) { Results.Add(CurrentItem); } } } return Results; } /// /// 选择所有最小值对应的对象。 /// 若没有元素则返回空列表。 /// public static List MinByAll(this IEnumerable List, Func Selector) where C : IComparable { var Results = new List(); using (var Enumerator = List.GetEnumerator()) { if (!Enumerator.MoveNext()) { return Results; } T MinItem = Enumerator.Current; C MinValue = Selector(MinItem); Results.Add(MinItem); while (Enumerator.MoveNext()) { T CurrentItem = Enumerator.Current; C CurrentValue = Selector(CurrentItem); int Comparison = CurrentValue.CompareTo(MinValue); if (Comparison < 0) { MinValue = CurrentValue; Results.Clear(); Results.Add(CurrentItem); } else if (Comparison == 0) { Results.Add(CurrentItem); } } } return Results; } /// /// 选择最大值对应的对象。 /// 若没有元素则返回 Nothing。 /// public static T MaxBy(this IEnumerable Source, Func Selector) where C : IComparable { using (var Enumerator = Source.GetEnumerator()) { if (!Enumerator.MoveNext()) { return default(T); } T MaxItem = Enumerator.Current; C MaxValue = Selector(MaxItem); while (Enumerator.MoveNext()) { C Value = Selector(Enumerator.Current); if (Value.CompareTo(MaxValue) <= 0) { continue; } MaxItem = Enumerator.Current; MaxValue = Value; } return MaxItem; } } /// /// 选择最小值对应的对象。 /// 若没有元素则返回 Nothing。 /// public static T MinBy(this IEnumerable List, Func Selector) where C : IComparable { using (var Enumerator = List.GetEnumerator()) { if (!Enumerator.MoveNext()) { return default; } T MinItem = Enumerator.Current; C MinValue = Selector(MinItem); while (Enumerator.MoveNext()) { C Value = Selector(Enumerator.Current); if (Value.CompareTo(MinValue) >= 0) { continue; } MinItem = Enumerator.Current; MinValue = Value; } return MinItem; } } } }