using System; using System.Collections.Generic; using System.Linq; namespace BS.Shared.Extensions { public static class IListTExtensions { public static void AddIfNotIn(this IList pList, T pToAdd) { if (!pList.Contains(pToAdd)) { pList.Add(pToAdd); } } public static void AddRangeIfElementsNotIn(this IList pList, IEnumerable pToAdd) { foreach (var iItem in pToAdd) { pList.AddIfNotIn(iItem); } } public static void AddRange(this IList pList, IEnumerable pToAdd) { foreach (T iItem in pToAdd) { pList.Add(iItem); } } public static bool Exists(this IList pList, Predicate pMatch) { foreach (T iItem in pList) { if (pMatch(iItem)) { return true; } } return false; } public static void MakeEqualTo(this IList plist, IList otherList) { var toRemove = new List(); foreach (T t in plist) { if (!otherList.Contains(t)) { toRemove.Add(t); } } plist.RemoveRange(toRemove); foreach (T t in otherList) { if (!plist.Contains(t)) { plist.Insert(otherList.IndexOf(t), t); } } } public static void RemoveRange(this IList pList, IEnumerable pToRemove) { foreach (T iItem in pToRemove.ToList()) { pList.Remove(iItem); } } public static void RemoveRange(this IList pList, Predicate pMatch) { List lToDelete = pList.Where(t => pMatch(t)).ToList(); pList.RemoveRange(lToDelete); } public static List GetElementsInCommon(List> listCollection) { var result = new List(); var allElements = new List(); listCollection.DoForEach(list => { allElements.AddRangeIfElementsNotIn(list); }); allElements.DoForEach(element => { if(listCollection.TrueForAll(list => list.Contains(element))) { result.AddIfNotIn(element); } }); return result; } public static List Clone(this IList list) { return list?.ToList() ?? new List(); } public static void AddRangeIfElementsNotIn(this IList list, IList toAdd) { foreach(var item in toAdd) { list.AddIfNotIn(item); } } public static void AddRange(this IList list, IList toAdd) { foreach(T item in toAdd) { list.Add(item); } } public static bool AreListEqual(this IList list1, IList list2) { if(list2 is null) { return false; } return list1.Count == list2.Count && list1.All(list2.Contains) && list2.All(list1.Contains); } } }