using System; using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; using Nerd_STF.Mathematics; namespace Nerd_STF.Lists { [Serializable] public class List : IEnumerable, IEnumerable { public static List Empty => new(); internal T[] array; public int this[T item] { get => FindIndex(item); set => Insert(value, item); } public T this[int index] { get => array[index]; set => array[index] = value; } public List Duplicate => new(array); public bool IsEmpty => array == Array.Empty(); public bool IsNull => array == null; public bool IsNullOrEmpty => IsNull || IsEmpty; public int Length => array.Length; public List() => array = Array.Empty(); public List(params T[] items) => array = items; public List(int length) => array = new T[length]; public List(int length, T itemAll) { array = new T[length]; for (int i = 0; i < array.Length; i++) array[i] = itemAll; } public List(IEnumerable items) { int length = 0; foreach (object _ in items) length++; array = new T[length]; AddRange(items); } public List(IEnumerable items) { int length = 0; foreach (object _ in items) length++; if (length == 0) array = Array.Empty(); AddRange(items); } public List(List list) => array = list.array; public void Add() => Add(default); public void Add(T item) { if (array == null || array == Array.Empty()) array = new T[1] { item }; else { T[] old = array; array = new T[old.Length + 1]; for (int i = 0; i < old.Length; i++) array[i] = old[i]; array[old.Length] = item; } } public void AddRange(IEnumerable items) { foreach (T t in items) Add(t); } public void AddRange(IEnumerable items) { foreach (T t in items) Add(t); } public void AddRange(List items) { foreach (T t in items) Add(t); } public void AddRange(params T[] items) { foreach (T t in items) Add(t); } public bool Any(Predicate predicate) { foreach (T t in array) if (predicate.Invoke(t)) return true; return false; } public bool Any(T match) { foreach (T t in array) if (t.Equals(match)) return true; return false; } public void Clear(bool resetSize = false) { if (resetSize) array = Array.Empty(); else { for (int i = 0; i < array.Length; i++) array[i] = default; } } public bool Contains(Predicate predicate) { foreach (T t in array) if (predicate.Invoke(t)) return true; return false; } public bool Contains(T match) { foreach (T t in array) if (t.Equals(match)) return true; return false; } public int Count() { int r = 0; foreach (T _ in array) r++; return r; } public int Count(Predicate predicate) { if (!Contains(predicate)) return 0; int r = 0; foreach (T t in array) if (predicate.Invoke(t)) r++; return r; } public int Count(T match) { if (!Contains(match)) return 0; int r = 0; foreach (T t in array) if (t.Equals(match)) r++; return r; } public void Fill(T item) { for (int i = 0; i < Length; i++) array[i] = item; } public T Find(Predicate predicate) { foreach (T t in array) if (predicate.Invoke(t)) return t; throw new Exception("Parameter " + nameof(predicate) + " does not exist in the list."); } public T Find(T match) { foreach (T t in array) if (t.Equals(match)) return t; throw new Exception("Parameter " + nameof(match) + " does not exist in the list."); } public T Find(Predicate predicate, int start) { for (int i = start; i < array.Length; i++) if (predicate.Invoke(array[i])) return array[i]; throw new Exception("Parameter " + nameof(predicate) + " does not exist in the list."); } public T Find(T match, int start) { for (int i = start; i < array.Length; i++) if (array[i].Equals(match)) return array[i]; throw new Exception("Parameter " + nameof(match) + " does not exist in the list."); } public T Find(Predicate predicate, int start, int max) { for (int i = start; i <= max; i++) if (predicate.Invoke(array[i])) return array[i]; throw new Exception("Parameter " + nameof(predicate) + " does not exist in the list."); } public T Find(T match, int start, int max) { for (int i = start; i <= max; i++) if (array[i].Equals(match)) return array[i]; throw new Exception("Parameter " + nameof(match) + " does not exist in the list."); } public T FindOrDefault(Predicate predicate) { foreach (T t in array) if (predicate.Invoke(t)) return t; return default; } public T FindOrDefault(T match) { foreach (T t in array) if (t.Equals(match)) return t; return default; } public T FindOrDefault(Predicate predicate, int start) { for (int i = start; i < array.Length; i++) if (predicate.Invoke(array[i])) return array[i]; return default; } public T FindOrDefault(T match, int start) { for (int i = start; i < array.Length; i++) if (array[i].Equals(match)) return array[i]; return default; } public T FindOrDefault(Predicate predicate, int start, int max) { for (int i = start; i <= max; i++) if (predicate.Invoke(array[i])) return array[i]; return default; } public T FindOrDefault(T match, int start, int max) { for (int i = start; i <= max; i++) if (array[i].Equals(match)) return array[i]; return default; } public List FindAll(Predicate predicate) { List r = new(); foreach (T t in array) if (predicate.Invoke(t)) r.Add(t); return r; } public List FindAll(T match) { List r = new(); foreach (T t in array) if (t.Equals(match)) r.Add(t); return r; } public List FindAll(Predicate predicate, int start) { List r = new(); for (int i = start; i < array.Length; i++) if (predicate.Invoke(array[i])) r.Add(array[i]); return r; } public List FindAll(T match, int start) { List r = new(); for (int i = start; i < array.Length; i++) if (array[i].Equals(match)) r.Add(array[i]); return r; } public List FindAll(Predicate predicate, int start, int max) { List r = new(); for (int i = start; i <= max; i++) if (predicate.Invoke(array[i])) r.Add(array[i]); return r; } public List FindAll(T match, int start, int max) { List r = new(); for (int i = start; i <= max; i++) if (array[i].Equals(match)) r.Add(array[i]); return r; } public T FindLast(Predicate predicate) { for (int i = array.Length - 1; i >= 0; i--) if (predicate.Invoke(array[i])) return array[i]; throw new Exception("Parameter " + nameof(predicate) + " does not exist in the list."); } public T FindLast(T match) { for (int i = array.Length - 1; i >= 0; i--) if (array[i].Equals(match)) return array[i]; throw new Exception("Parameter " + nameof(match) + " does not exist in the list."); } public T FindLast(Predicate predicate, int start) { for (int i = array.Length - 1; i >= start; i--) if (predicate.Invoke(array[i])) return array[i]; throw new Exception("Parameter " + nameof(predicate) + " does not exist in the list."); } public T FindLast(T match, int start) { for (int i = array.Length - 1; i >= start; i--) if (array[i].Equals(match)) return array[i]; throw new Exception("Parameter " + nameof(match) + " does not exist in the list."); } public T FindLast(Predicate predicate, int start, int max) { for (int i = max; i >= start; i--) if (predicate.Invoke(array[i])) return array[i]; throw new Exception("Parameter " + nameof(predicate) + " does not exist in the list."); } public T FindLast(T match, int start, int max) { for (int i = max; i >= start; i--) if (array[i].Equals(match)) return array[i]; throw new Exception("Parameter " + nameof(match) + " does not exist in the list."); } public T FindLastOrDefault(Predicate predicate) { for (int i = array.Length - 1; i >= 0; i--) if (predicate.Invoke(array[i])) return array[i]; return default; } public T FindLastOrDefault(T match) { for (int i = array.Length - 1; i >= 0; i--) if (array[i].Equals(match)) return array[i]; return default; } public T FindLastOrDefault(Predicate predicate, int start) { for (int i = array.Length - 1; i >= start; i--) if (predicate.Invoke(array[i])) return array[i]; return default; } public T FindLastOrDefault(T match, int start) { for (int i = array.Length - 1; i >= start; i--) if (array[i].Equals(match)) return array[i]; return default; } public T FindLastOrDefault(Predicate predicate, int start, int max) { for (int i = max; i >= start; i--) if (predicate.Invoke(array[i])) return array[i]; return default; } public T FindLastOrDefault(T match, int start, int max) { for (int i = max; i >= start; i--) if (array[i].Equals(match)) return array[i]; return default; } public int FindIndex(Predicate predicate) { for (int i = 0; i < array.Length; i++) if (predicate.Invoke(array[i])) return i; return -1; } public int FindIndex(T match) { for (int i = 0; i < array.Length; i++) if (array[i].Equals(match)) return i; return -1; } public int FindIndex(Predicate predicate, int start) { for (int i = start; i < array.Length; i++) if (predicate.Invoke(array[i])) return i; return -1; } public int FindIndex(T match, int start) { for (int i = start; i < array.Length; i++) if (array[i].Equals(match)) return i; return -1; } public int FindIndex(Predicate predicate, int start, int max) { for (int i = start; i <= max; i++) if (predicate.Invoke(array[i])) return i; return -1; } public int FindIndex(T match, int start, int max) { for (int i = start; i <= max; i++) if (array[i].Equals(match)) return i; return -1; } public List FindAllIndex() { List ret = new(); for (int i = 0; i < array.Length; i++) ret.Add(i); return ret; } public List FindAllIndex(Predicate predicate) { List r = new(); for (int i = 0; i < array.Length; i++) if (predicate.Invoke(array[i])) r.Add(i); return r; } public List FindAllIndex(T match) { List r = new(); for (int i = 0; i < array.Length; i++) if (array[i].Equals(match)) r.Add(i); return r; } public List FindAllIndex(int start) { List ret = new(); for (int i = start; i < array.Length; i++) ret.Add(i); return ret; } public List FindAllIndex(Predicate predicate, int start) { List r = new(); for (int i = start; i < array.Length; i++) if (predicate.Invoke(array[i])) r.Add(i); return r; } public List FindAllIndex(T match, int start) { List r = new(); for (int i = start; i < array.Length; i++) if (array[i].Equals(match)) r.Add(i); return r; } public List FindAllIndex(int start, int max) { List ret = new(); for (int i = start; i <= max; i++) ret.Add(i); return ret; } public List FindAllIndex(Predicate predicate, int start, int max) { List r = new(); for (int i = start; i <= max; i++) if (predicate.Invoke(array[i])) r.Add(i); return r; } public List FindAllIndex(T match, int start, int max) { List r = new(); for (int i = start; i <= max; i++) if (array[i].Equals(match)) r.Add(i); return r; } public int FindLastIndex(Predicate predicate) { for (int i = array.Length - 1; i >= 0; i--) if (predicate.Invoke(array[i])) return i; return -1; } public int FindLastIndex(T match) { for (int i = array.Length - 1; i >= 0; i--) if (array[i].Equals(match)) return i; return -1; } public int FindLastIndex(Predicate predicate, int start) { for (int i = array.Length - 1; i >= start; i--) if (predicate.Invoke(array[i])) return i; return -1; } public int FindLastIndex(T match, int start) { for (int i = array.Length - 1; i >= start; i--) if (array[i].Equals(match)) return i; return -1; } public int FindLastIndex(Predicate predicate, int start, int max) { for (int i = max; i >= start; i--) if (predicate.Invoke(array[i])) return i; return -1; } public int FindLastIndex(T match, int start, int max) { for (int i = max; i >= start; i--) if (array[i].Equals(match)) return i; return -1; } public IEnumerator GetEnumerator() => array.GetEnumerator(); IEnumerator IEnumerable.GetEnumerator() => (IEnumerator)array.GetEnumerator(); public List GetRange(int start, int max) { List r = new(); for (int i = start; i <= max; i++) r.Add(array[i]); return r; } public void Insert(int index, T item) { T[] old = array; array = new T[old.Length + 1]; for (int i = 0; i < index; i++) array[i] = old[i]; array[index] = item; for (int i = index + 1; i < array.Length; i++) array[i] = old[i - 1]; } public void InsertRange(int index, IEnumerable items) { List list = new(items); T[] old = array; array = new T[old.Length + list.Length]; for (int i = 0; i < index; i++) array[i] = old[i]; for (int i = 0; i < list.Length; i++) array[index + i] = list[i]; for (int i = index + list.Length; i < array.Length; i++) array[i] = old[i - list.Length]; } public bool MatchesAll(Predicate predicate) => FindAll(predicate).array == array; public bool MatchesAll(T match) => FindAll(match).array == array; public void Randomize() { List newL = new(); List possibleIndexes = FindAllIndex(); for (int i = 0; i < possibleIndexes.Length; i++) { int index = possibleIndexes[new Random().Next(0, possibleIndexes.Length)]; newL.Add(array[index]); possibleIndexes.Remove(x => x == index); } array = newL.ToArray(); } public void Remove(Predicate predicate) => Remove(FindIndex(predicate)); public void Remove(T item) => Remove(FindIndex(item)); public void Remove(int index) { List newList = new(); for (int i = 0; i < array.Length; i++) if (i != index) newList.Add(array[i]); array = newList.array; } public void RemoveAll(Predicate predicate) { foreach (int i in FindAllIndex(predicate)) Remove(i); } public void RemoveAll(T match) { foreach (int i in FindAllIndex(match)) Remove(i); } public void RemoveLast(Predicate predicate) => Remove(FindLastIndex(predicate)); public void RemoveLast(T item) => Remove(FindLastIndex(item)); public void RemoveRange(int index, int max) { List newList = new(); for (int i = 0; i < array.Length; i++) if (i < index || i > max) newList.Add(array[i]); array = newList.array; } public void Reverse() { T[] old = array; array = new T[old.Length]; for (int i = old.Length - 1; i >= 0; i--) array[i] = old[i]; } public void Shuffle() => Randomize(); public T[] ToArray() => array; public ReadOnlyList ToReadOnly() { return new ReadOnlyList(array); } public ReadOnlyCollection ToSystemReadOnly() { return new ReadOnlyCollection(array); } public System.Collections.Generic.List ToSystemList() { return new System.Collections.Generic.List(array); } public override bool Equals(object obj) => base.Equals(obj); public bool Equals(T[] other) { bool returned = true; if (Length == other.Length) { for (int i = 0; i < Length; i++) { returned &= array[i].Equals(other[i]); } } return returned; } public bool Equals(List list) { if (Length != list.Length) return false; bool equal = true; for (int i = 0; i < Length; i++) equal &= array[i].Equals(list[i]); return equal; } public bool Equals(IEnumerable list) => Equals(new List(list)); public override int GetHashCode() => base.GetHashCode(); public override string ToString() => ToString(false); public string ToString(bool showAll = false) { string ret = "List of " + Length + " Elements (" + typeof(T).ToString() + ")"; if (showAll) for (int i = 0; i < Length; i++) ret += "\n" + i + ": " + array[i]; return ret; } public static List operator +(List a, T b) { a.Add(b); return a; } public static List operator +(List a, IEnumerable b) { a.AddRange(b); return a; } public static List operator +(List a, List b) { a.AddRange(b); return a; } public static List operator +(List a, T[] b) { a.AddRange(b); return a; } public static List operator -(List a, int remove) { List returned = new(a.Length - remove); for (int i = 0; i < returned.Length; i++) { returned[i] = a[i]; } return returned; } public static List operator -(List a, int[] removes) { foreach (int remove in removes) { a.Remove(remove); } return a; } public static List operator -(List a, List removes) { foreach (int remove in removes) { a.Remove(remove); } return a; } public static List operator -(List a, T b) { a.Remove(b); return a; } public static bool operator ==(List a, List b) => a.Equals(b); public static bool operator ==(List a, T[] b) { return a.Equals(b); } public static bool operator ==(T[] a, List b) { return b.Equals(a); } public static bool operator !=(List a, List b) => !a.Equals(b); public static bool operator !=(List a, T[] b) { return !a.Equals(b); } public static bool operator !=(T[] a, List b) { return !b.Equals(a); } } [Serializable] [Obsolete("This class will be removed or heavily modified in a future release.")] public class Matrix { internal List> lists; public Vector2 Length => new(lists[0].Length, lists.Length); public int LengthX => lists[0].Length; public int LengthY => lists.Length; public static Matrix Empty => new() { lists = List>.Empty }; public Matrix() => lists = new List>(1, new List(1, default)); public Matrix(int lengthX, int lengthY) { if (lengthX < 1) throw new ArgumentOutOfRangeException(nameof(lengthX), "Do not include a length of less than 1"); if (lengthY < 1) throw new ArgumentOutOfRangeException(nameof(lengthY), "Do not include a width of less than 1"); lists = new List>(lengthY, new List(lengthX)); } public Matrix(int lengthX, int lengthY, T inputAll) { if (lengthX < 1) throw new ArgumentOutOfRangeException(nameof(lengthX), "Do not include a length of less than 1"); if (lengthY < 1) throw new ArgumentOutOfRangeException(nameof(lengthY), "Do not include a width of less than 1"); lists = new List>(lengthY, new List(lengthX, inputAll)); } public T this[int indexX, int indexY] { get => Get(indexX, indexY); set => Set(indexX, indexY, value); } public void Add(Matrix input, DirectionType addDir) { if (addDir == DirectionType.y) { foreach (List list in input.lists) AddY(list); return; } foreach (List list in input.lists) AddX(list); } public void AddX() { foreach (List list in lists) list.Add(); } public void AddX(T input) { foreach (List list in lists) list.Add(input); } public void AddX(T[] input) { foreach (T t in input) AddX(t); } public void AddX(List input) { foreach (T t in input) AddX(t); } public void AddY() => lists.Add(new List(lists[0].Length)); public void AddY(T input) => lists.Add(new List(lists[0].Length, input)); public void AddY(T[] input) { if (input.Length > lists[0].Length) throw new OverflowException(); lists.Add(new List(input)); } public void AddY(List input) { if (input.Length > lists[0].Length) throw new OverflowException(); lists.Add(input); } public bool Check(int placeX, int placeY) => lists[placeY][placeX] != null; public bool Compare(T input) { foreach (List list in lists) if (list.Contains(input)) return true; return false; } public void Convert(T input) { for (int i = 0; i < lists.Length; i++) lists[i] = new(input); } public void Convert(T[] input) { for (int i = 0; i < lists.Length; i++) lists[i] = new(input); } public void Convert(List input) { for (int i = 0; i < lists.Length; i++) lists[i] = input; } public void Convert(Matrix input) => lists = input.lists; public int Count() { int returned = 0; foreach (List list in lists) returned += list.Count(); return returned; } public int Count(DirectionType type) { if (type == DirectionType.y) return LengthY; return LengthX; } public Vector2 CountXY() => Length; public T Get(int placeX, int placeY) => lists[placeY][placeX]; public void Get(int placeX, int placeY, out T output) => output = Get(placeX, placeY); public List GetAll() { List returned = new(); foreach (List list in lists) returned.AddRange(list); return returned; } public void GetAll(out List output) { List returned = new(); foreach (List list in lists) returned.AddRange(list); output = returned; } public IEnumerator GetEnumerator() { foreach (List list in lists) foreach (T t in list) yield return t; } public void Remove(int placeX, int placeY) => lists[placeY].Remove(placeX); public void Set(int placeX, int placeY, T input) => lists[placeY][placeX] = input; public void SetAll(T input) { for (int i = 0; i < lists.Length; i++) for (int j = 0; j < lists[i].Length; j++) lists[i][j] = input; } public static Matrix AllDefault(int lengthX, int lengthY) => new(lengthX, lengthY, default); public override bool Equals(object obj) => base.Equals(obj); public bool Equals(Matrix other) => GetAll() == other.GetAll(); public override int GetHashCode() => base.GetHashCode(); public override string ToString() => lists.ToString(); public string ToString(bool showAll) { if (showAll) { string r = ""; for (int i = 0; i < lists.Length; i++) { for (int j = 0; j < lists[i].Length; j++) { r += lists[i][j]; if (j != lists[i].Length - 1) r += ", "; } if (i != lists.Length - 1) r += "\n"; } return r; } else return ToString(); } public static bool operator ==(Matrix a, Matrix b) => a.Equals(b); public static bool operator !=(Matrix a, Matrix b) => !a.Equals(b); public enum DirectionType { x, y, } } [Serializable] public class ReadOnlyList : IEnumerable, IEnumerable { public static ReadOnlyList Empty => new(); internal T[] array; public T this[int index] => array[index]; public List Duplicate => new(array); public bool IsEmpty => array == Array.Empty(); public bool IsNull => array == null; public bool IsNullOrEmpty => IsNull || IsEmpty; public int Length => array.Length; public ReadOnlyList() => array = Array.Empty(); public ReadOnlyList(params T[] items) => array = items; public ReadOnlyList(int length) => array = new T[length]; public ReadOnlyList(int length, T itemAll) { array = new T[length]; for (int i = 0; i < array.Length; i++) array[i] = itemAll; } public ReadOnlyList(IEnumerable items) => array = new List(items).ToArray(); public bool Contains(Predicate predicate) { foreach (T t in array) if (predicate.Invoke(t)) return true; return false; } public bool Contains(T match) { foreach (T t in array) if (t.Equals(match)) return true; return false; } public int Count() { int r = 0; foreach (T _ in array) r++; return r; } public int Count(Predicate predicate) { if (!Contains(predicate)) return 0; int r = 0; foreach (T t in array) if (predicate.Invoke(t)) r++; return r; } public int Count(T match) { if (!Contains(match)) return 0; int r = 0; foreach (T t in array) if (t.Equals(match)) r++; return r; } public T Find(Predicate predicate) { foreach (T t in array) if (predicate.Invoke(t)) return t; throw new Exception("Parameter " + nameof(predicate) + " does not exist in the list."); } public T Find(T match) { foreach (T t in array) if (t.Equals(match)) return t; throw new Exception("Parameter " + nameof(match) + " does not exist in the list."); } public T Find(Predicate predicate, int start) { for (int i = start; i < array.Length; i++) if (predicate.Invoke(array[i])) return array[i]; throw new Exception("Parameter " + nameof(predicate) + " does not exist in the list."); } public T Find(T match, int start) { for (int i = start; i < array.Length; i++) if (array[i].Equals(match)) return array[i]; throw new Exception("Parameter " + nameof(match) + " does not exist in the list."); } public T Find(Predicate predicate, int start, int max) { for (int i = start; i <= max; i++) if (predicate.Invoke(array[i])) return array[i]; throw new Exception("Parameter " + nameof(predicate) + " does not exist in the list."); } public T Find(T match, int start, int max) { for (int i = start; i <= max; i++) if (array[i].Equals(match)) return array[i]; throw new Exception("Parameter " + nameof(match) + " does not exist in the list."); } public T FindOrDefault(Predicate predicate) { foreach (T t in array) if (predicate.Invoke(t)) return t; return default; } public T FindOrDefault(T match) { foreach (T t in array) if (t.Equals(match)) return t; return default; } public T FindOrDefault(Predicate predicate, int start) { for (int i = start; i < array.Length; i++) if (predicate.Invoke(array[i])) return array[i]; return default; } public T FindOrDefault(T match, int start) { for (int i = start; i < array.Length; i++) if (array[i].Equals(match)) return array[i]; return default; } public T FindOrDefault(Predicate predicate, int start, int max) { for (int i = start; i <= max; i++) if (predicate.Invoke(array[i])) return array[i]; return default; } public T FindOrDefault(T match, int start, int max) { for (int i = start; i <= max; i++) if (array[i].Equals(match)) return array[i]; return default; } public List FindAll(Predicate predicate) { List r = new(); foreach (T t in array) if (predicate.Invoke(t)) r.Add(t); return r; } public List FindAll(T match) { List r = new(); foreach (T t in array) if (t.Equals(match)) r.Add(t); return r; } public List FindAll(Predicate predicate, int start) { List r = new(); for (int i = start; i < array.Length; i++) if (predicate.Invoke(array[i])) r.Add(array[i]); return r; } public List FindAll(T match, int start) { List r = new(); for (int i = start; i < array.Length; i++) if (array[i].Equals(match)) r.Add(array[i]); return r; } public List FindAll(Predicate predicate, int start, int max) { List r = new(); for (int i = start; i <= max; i++) if (predicate.Invoke(array[i])) r.Add(array[i]); return r; } public List FindAll(T match, int start, int max) { List r = new(); for (int i = start; i <= max; i++) if (array[i].Equals(match)) r.Add(array[i]); return r; } public T FindLast(Predicate predicate) { for (int i = array.Length - 1; i >= 0; i--) if (predicate.Invoke(array[i])) return array[i]; throw new Exception("Parameter " + nameof(predicate) + " does not exist in the list."); } public T FindLast(T match) { for (int i = array.Length - 1; i >= 0; i--) if (array[i].Equals(match)) return array[i]; throw new Exception("Parameter " + nameof(match) + " does not exist in the list."); } public T FindLast(Predicate predicate, int start) { for (int i = array.Length - 1; i >= start; i--) if (predicate.Invoke(array[i])) return array[i]; throw new Exception("Parameter " + nameof(predicate) + " does not exist in the list."); } public T FindLast(T match, int start) { for (int i = array.Length - 1; i >= start; i--) if (array[i].Equals(match)) return array[i]; throw new Exception("Parameter " + nameof(match) + " does not exist in the list."); } public T FindLast(Predicate predicate, int start, int max) { for (int i = max; i >= start; i--) if (predicate.Invoke(array[i])) return array[i]; throw new Exception("Parameter " + nameof(predicate) + " does not exist in the list."); } public T FindLast(T match, int start, int max) { for (int i = max; i >= start; i--) if (array[i].Equals(match)) return array[i]; throw new Exception("Parameter " + nameof(match) + " does not exist in the list."); } public T FindLastOrDefault(Predicate predicate) { for (int i = array.Length - 1; i >= 0; i--) if (predicate.Invoke(array[i])) return array[i]; return default; } public T FindLastOrDefault(T match) { for (int i = array.Length - 1; i >= 0; i--) if (array[i].Equals(match)) return array[i]; return default; } public T FindLastOrDefault(Predicate predicate, int start) { for (int i = array.Length - 1; i >= start; i--) if (predicate.Invoke(array[i])) return array[i]; return default; } public T FindLastOrDefault(T match, int start) { for (int i = array.Length - 1; i >= start; i--) if (array[i].Equals(match)) return array[i]; return default; } public T FindLastOrDefault(Predicate predicate, int start, int max) { for (int i = max; i >= start; i--) if (predicate.Invoke(array[i])) return array[i]; return default; } public T FindLastOrDefault(T match, int start, int max) { for (int i = max; i >= start; i--) if (array[i].Equals(match)) return array[i]; return default; } public int FindIndex(Predicate predicate) { for (int i = 0; i < array.Length; i++) if (predicate.Invoke(array[i])) return i; return -1; } public int FindIndex(T match) { for (int i = 0; i < array.Length; i++) if (array[i].Equals(match)) return i; return -1; } public int FindIndex(Predicate predicate, int start) { for (int i = start; i < array.Length; i++) if (predicate.Invoke(array[i])) return i; return -1; } public int FindIndex(T match, int start) { for (int i = start; i < array.Length; i++) if (array[i].Equals(match)) return i; return -1; } public int FindIndex(Predicate predicate, int start, int max) { for (int i = start; i <= max; i++) if (predicate.Invoke(array[i])) return i; return -1; } public int FindIndex(T match, int start, int max) { for (int i = start; i <= max; i++) if (array[i].Equals(match)) return i; return -1; } public List FindAllIndex() { List ret = new(); for (int i = 0; i < array.Length; i++) ret.Add(i); return ret; } public List FindAllIndex(Predicate predicate) { List r = new(); for (int i = 0; i < array.Length; i++) if (predicate.Invoke(array[i])) r.Add(i); return r; } public List FindAllIndex(T match) { List r = new(); for (int i = 0; i < array.Length; i++) if (array[i].Equals(match)) r.Add(i); return r; } public List FindAllIndex(int start) { List ret = new(); for (int i = start; i < array.Length; i++) ret.Add(i); return ret; } public List FindAllIndex(Predicate predicate, int start) { List r = new(); for (int i = start; i < array.Length; i++) if (predicate.Invoke(array[i])) r.Add(i); return r; } public List FindAllIndex(T match, int start) { List r = new(); for (int i = start; i < array.Length; i++) if (array[i].Equals(match)) r.Add(i); return r; } public List FindAllIndex(int start, int max) { List ret = new(); for (int i = start; i <= max; i++) ret.Add(i); return ret; } public List FindAllIndex(Predicate predicate, int start, int max) { List r = new(); for (int i = start; i <= max; i++) if (predicate.Invoke(array[i])) r.Add(i); return r; } public List FindAllIndex(T match, int start, int max) { List r = new(); for (int i = start; i <= max; i++) if (array[i].Equals(match)) r.Add(i); return r; } public int FindLastIndex(Predicate predicate) { for (int i = array.Length - 1; i >= 0; i--) if (predicate.Invoke(array[i])) return i; return -1; } public int FindLastIndex(T match) { for (int i = array.Length - 1; i >= 0; i--) if (array[i].Equals(match)) return i; return -1; } public int FindLastIndex(Predicate predicate, int start) { for (int i = array.Length - 1; i >= start; i--) if (predicate.Invoke(array[i])) return i; return -1; } public int FindLastIndex(T match, int start) { for (int i = array.Length - 1; i >= start; i--) if (array[i].Equals(match)) return i; return -1; } public int FindLastIndex(Predicate predicate, int start, int max) { for (int i = max; i >= start; i--) if (predicate.Invoke(array[i])) return i; return -1; } public int FindLastIndex(T match, int start, int max) { for (int i = max; i >= start; i--) if (array[i].Equals(match)) return i; return -1; } public IEnumerator GetEnumerator() => array.GetEnumerator(); IEnumerator IEnumerable.GetEnumerator() => (IEnumerator)array.GetEnumerator(); public List GetRange(int start, int max) { List r = new(); for (int i = start; i <= max; i++) r.Add(array[i]); return r; } public bool MatchesAll(Predicate predicate) => FindAll(predicate).array == array; public bool MatchesAll(T match) => FindAll(match).array == array; public T[] ToArray() => array; public List ToList() => new(array); public System.Collections.Generic.List ToSystemList() => new(array); public ReadOnlyCollection ToSystemReadOnly() => new(array); public override bool Equals(object obj) => base.Equals(obj); public bool Equals(T[] other) { bool returned = true; if (Length == other.Length) { for (int i = 0; i < Length; i++) { returned &= array[i].Equals(other[i]); } } return returned; } public bool Equals(ReadOnlyList list) { if (Length != list.Length) return false; bool equal = true; for (int i = 0; i < Length; i++) equal &= array[i].Equals(list[i]); return equal; } public bool Equals(IEnumerable list) => Equals(new ReadOnlyList(list)); public override int GetHashCode() => base.GetHashCode(); public override string ToString() => ToString(false); public string ToString(bool showAll = false) { string ret = "List of " + Length + " Elements (" + typeof(T).ToString() + ")"; if (showAll) for (int i = 0; i < Length; i++) ret += "\n" + i + ": " + array[i]; return ret; } public static bool operator ==(ReadOnlyList a, ReadOnlyList b) => a.Equals(b); public static bool operator ==(ReadOnlyList a, T[] b) { return a.Equals(b); } public static bool operator ==(T[] a, ReadOnlyList b) { return b.Equals(a); } public static bool operator ==(IEnumerable a, ReadOnlyList b) => a.Equals(b); public static bool operator ==(ReadOnlyList a, IEnumerable b) => a.Equals(b); public static bool operator !=(ReadOnlyList a, ReadOnlyList b) => !a.Equals(b); public static bool operator !=(ReadOnlyList a, T[] b) { return !a.Equals(b); } public static bool operator !=(T[] a, ReadOnlyList b) { return !b.Equals(a); } public static bool operator !=(IEnumerable a, ReadOnlyList b) => !a.Equals(b); public static bool operator !=(ReadOnlyList a, IEnumerable b) => !a.Equals(b); } }