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;
}
}
}
}