namespace Telegrator.RoslynExtensions { public static class CollectionsExtensions { public static IEnumerable Combine(params IEnumerable[] collections) => collections.SelectMany(x => x); public static IEnumerable IntersectBy(this IEnumerable first, IEnumerable second, Func selector) { foreach (TSource item in first) { TValue value = selector(item); if (second.Contains(value)) yield return item; } } public static IList UnionAdd(this IList source, IEnumerable toUnion, IEqualityComparer comparer) { foreach (TValue toUnionValue in toUnion) { if (!source.Contains(toUnionValue, comparer)) source.Add(toUnionValue); } return source; } public static void UnionAdd(this ICollection collection, IEnumerable target) { foreach (TSource item in target) { if (!collection.Contains(item)) collection.Add(item); } } public static void UnionAdd(this SortedList collection, IEnumerable target) { foreach (TSource item in target) { if (!collection.Values.Contains(item)) collection.Add(item, item); } } public static int IndexOf(this IEnumerable source, Func predicate) { int index = 0; foreach (T item in source) { if (predicate.Invoke(item)) return index; index++; } return -1; } public static IEnumerable Repeat(this T item, int times) => Enumerable.Range(0, times).Select(_ => item); } }