using System.Collections; using System.Collections.Generic; using ScreenConnect; namespace System.Linq; public static class Enumerable { private class ListGrouping : IGrouping, IEnumerable, IEnumerable { private List list; public TKey Key { get; } public ListGrouping(TKey key, List list) { Key = key; this.list = list; } public IEnumerator GetEnumerator() { return list.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } } public static IEnumerable SelectMany(this IEnumerable source, Func> collectionSelector, Func resultSelector) { foreach (TSource element in source) { foreach (TCollection item in collectionSelector(element)) { yield return resultSelector(element, item); } } } public static IEnumerable Select(this IEnumerable source, Func selector) { foreach (TSource item in source) { yield return selector(item); } } public static IEnumerable Select(this IEnumerable source, Func selector) { int index = 0; foreach (TSource item in source) { yield return selector(item, index++); } } public static IEnumerable SelectMany(this IEnumerable source, Func> selector) { foreach (TSource item in source) { foreach (TResult item2 in selector(item)) { yield return item2; } } } public static IEnumerable SelectMany(this IEnumerable source, Func> selector) { int sourceIndex = 0; foreach (TSource item in source) { foreach (TResult item2 in selector(item, sourceIndex++)) { yield return item2; } } } public static IEnumerable Where(this IEnumerable source, Func predicate) { foreach (TSource item in source) { if (predicate(item)) { yield return item; } } } public static IEnumerable Where(this IEnumerable source, Func predicate) { int index = 0; foreach (TSource item in source) { if (predicate(item, index++)) { yield return item; } } } public static TSource? FirstOrDefault(this IEnumerable source) { if (source is IList list) { if (list.Count > 0) { return list[0]; } } else { using IEnumerator enumerator = source.GetEnumerator(); if (enumerator.MoveNext()) { return enumerator.Current; } } return default(TSource); } public static TSource? FirstOrDefault(this IEnumerable source, Func predicate) { foreach (TSource item in source) { if (predicate(item)) { return item; } } return default(TSource); } public static List ToList(this IEnumerable source) { return new List(source); } public static TSource[] ToArray(this IEnumerable source) { ICollection collection = source as ICollection; if (collection == null) { return new List(source).ToArray(); } return new TSource[collection.Count].Mutate(delegate(TSource[] it) { collection.CopyTo(it, 0); }); } public static HashSet ToHashSet(this IEnumerable? source) where TSource : notnull { return source.ToHashSet(null); } public static HashSet ToHashSet(this IEnumerable? source, IEqualityComparer? comparer) where TSource : notnull { return new HashSet(source, comparer); } public static IEnumerable OfType(this IEnumerable? source) { if (source == null) { yield break; } foreach (object item in source) { if (item is TResult) { yield return (TResult)item; } } } public static IEnumerable Cast(this IEnumerable? source) { if (source is IEnumerable result) { return result; } return CastIterator(); IEnumerable CastIterator() { if (source != null) { foreach (object item in source) { yield return (TResult)item; } } } } public static IEnumerable Take(this IEnumerable source, int count) { int index = 0; foreach (TSource item in source) { int num = index + 1; index = num; if (num <= count) { yield return item; continue; } yield break; } } public static IEnumerable TakeWhile(this IEnumerable source, Func predicate) { foreach (TSource item in source) { if (predicate(item)) { yield return item; continue; } yield break; } } public static List OrderBy(this IEnumerable source, Func keySelector) { return source.OrderBy(keySelector, 1); } public static List OrderByDescending(this IEnumerable source, Func keySelector) { return source.OrderBy(keySelector, -1); } private static List OrderBy(this IEnumerable source, Func keySelector, int multiplier) { List list = new List(source); list.Sort((TSource x, TSource y) => multiplier * Comparer.Default.Compare(keySelector(x), keySelector(y))); return list; } public static IEnumerable> GroupBy(this IEnumerable source, Func keySelector) where TKey : notnull { Dictionary> dictionary = new Dictionary>(); foreach (TSource item in source) { TKey key = keySelector(item); List list = dictionary.TryGetValue(key); if (list == null) { list = (dictionary[key] = new List()); } list.Add(item); } foreach (var (key2, list4) in dictionary) { yield return new ListGrouping(key2, list4); } } public static IEnumerable GroupBy(this IEnumerable source, Func keySelector, Func, TResult> resultSelector) where TKey : notnull { return from it in source.GroupBy(keySelector) select resultSelector(it.Key, it); } public static Dictionary ToDictionary(this IEnumerable source, Func keySelector, Func valueSelector) { Dictionary dictionary = new Dictionary(); foreach (TSource item in source) { dictionary[keySelector(item)] = valueSelector(item); } return dictionary; } public static IEnumerable Concat(this IEnumerable first, IEnumerable second) { foreach (TSource item in first) { yield return item; } foreach (TSource item2 in second) { yield return item2; } } public static IEnumerable Reverse(this IEnumerable source) { List list = source.ToList(); for (int i = list.Count - 1; i >= 0; i--) { yield return list[i]; } } public static IEnumerable Skip(this IEnumerable source, int count) { using IEnumerator e = source.AssertArgumentNonNull("source").GetEnumerator(); while (count > 0 && e.MoveNext()) { count--; } if (count <= 0) { while (e.MoveNext()) { yield return e.Current; } yield break; } } public static int Sum(this IEnumerable source) { int num = 0; foreach (int item in source) { num += item; } return num; } public static int Sum(this IEnumerable source, Func selector) { int num = 0; foreach (TSource item in source) { num += selector(item); } return num; } public static TSource? Min(this IEnumerable source) where TSource : IComparable { return source.MinOrMax(minOrMax: true); } public static TSource? Max(this IEnumerable source) where TSource : IComparable { return source.MinOrMax(minOrMax: false); } private static TSource? MinOrMax(this IEnumerable source, bool minOrMax) where TSource : IComparable { TSource val = default(TSource); bool flag = true; int num = (minOrMax ? 1 : int.MinValue); int num2 = (minOrMax ? int.MaxValue : (-1)); Comparer comparer = Comparer.Default; foreach (TSource item in source) { if (flag || item == null) { val = item; flag = false; continue; } int num3 = comparer.Compare(val, item); if (num3 >= num && num3 <= num2) { val = item; } } return val; } public static IEnumerable Zip(this IEnumerable first, IEnumerable second, Func resultSelector) { using IEnumerator e1 = first.GetEnumerator(); using IEnumerator e2 = second.GetEnumerator(); while (e1.MoveNext() && e2.MoveNext()) { yield return resultSelector(e1.Current, e2.Current); } } public static float Average(this IEnumerable source) { int num = 0; float num2 = 0f; foreach (float item in source) { num++; num2 += item; } return num2 / (float)num; } public static TAccumulate Aggregate(this IEnumerable source, TAccumulate seed, Func func) { TAccumulate val = seed; foreach (TSource item in source) { val = func(val, item); } return val; } public static bool Contains(this IEnumerable source, TSource value, IEqualityComparer? comparer = null) { if (comparer == null) { comparer = EqualityComparer.Default; } foreach (TSource item in source) { if (comparer.Equals(item, value)) { return true; } } return false; } public static TSource First(this IEnumerable source) { if (source is IList list) { if (list.Count > 0) { return list[0]; } } else { using IEnumerator enumerator = source.GetEnumerator(); if (enumerator.MoveNext()) { return enumerator.Current; } } throw new InvalidOperationException(); } public static TSource First(this IEnumerable source, Func predicate) { foreach (TSource item in source) { if (predicate(item)) { return item; } } throw new InvalidOperationException(); } public static TSource Single(this IEnumerable source) { if (source is IList list) { if (list.Count == 0) { throw new InvalidOperationException("No elements"); } if (list.Count == 1) { return list[0]; } } else { using IEnumerator enumerator = source.GetEnumerator(); if (!enumerator.MoveNext()) { throw new InvalidOperationException("No elements"); } TSource current = enumerator.Current; if (!enumerator.MoveNext()) { return current; } } throw new InvalidOperationException("More than one element"); } public static TSource? ElementAtOrDefault(this IList source, int index) { if (source.Count > index) { return source[index]; } return default(TSource); } public static TSource? LastOrDefault(this IEnumerable source) { if (source is IList { Count: var count } list) { if (count > 0) { return list[count - 1]; } return default(TSource); } TSource result = default(TSource); foreach (TSource item in source) { result = item; } return result; } public static TSource Last(this IEnumerable source) { if (source is IList { Count: var count } list) { if (count == 0) { throw new InvalidOperationException(); } return list[count - 1]; } TSource result = default(TSource); bool flag = false; foreach (TSource item in source) { result = item; flag = true; } if (!flag) { throw new InvalidOperationException(); } return result; } public static TSource? LastOrDefault(this IEnumerable source, Func predicate) { TSource result = default(TSource); foreach (TSource item in source) { if (predicate(item)) { result = item; } } return result; } public static int Count(this IEnumerable source) { if (!(source is ICollection collection)) { if (source is ICollection collection2) { return collection2.Count; } int num = 0; { foreach (TSource item in source) { _ = item; num++; } return num; } } return collection.Count; } public static int Count(this IEnumerable source, Func predicate) { int num = 0; foreach (TSource item in source) { if (predicate(item)) { num++; } } return num; } public static bool Any(this IEnumerable source) { using (IEnumerator enumerator = source.GetEnumerator()) { if (enumerator.MoveNext()) { _ = enumerator.Current; return true; } } return false; } public static bool Any(this IEnumerable source, Func predicate) { foreach (TSource item in source) { if (predicate(item)) { return true; } } return false; } public static bool All(this IEnumerable source, Func predicate) { foreach (TSource item in source) { if (!predicate(item)) { return false; } } return true; } public static IEnumerable Range(int start, int count) { for (int i = 0; i < count; i++) { yield return start + i; } } public static IEnumerable Distinct(this IEnumerable source, IEqualityComparer? comparer = null) where TSource : notnull { HashSet set = new HashSet(comparer); foreach (TSource item in source) { if (!set.Contains(item)) { set.Add(item); yield return item; } } } }