using System; using System.Collections.Generic; using System.Linq; namespace NzbDrone.Common.Extensions { public static class EnumerableExtensions { public static IEnumerable DistinctBy(this IEnumerable source, Func keySelector) { var knownKeys = new HashSet(); return source.Where(element => knownKeys.Add(keySelector(element))); } public static IEnumerable IntersectBy(this IEnumerable first, Func firstKeySelector, IEnumerable second, Func secondKeySelector, IEqualityComparer keyComparer) { var keys = new HashSet(second.Select(secondKeySelector), keyComparer); foreach (var element in first) { var key = firstKeySelector(element); // Remove the key so we only yield once if (keys.Remove(key)) { yield return element; } } } public static IEnumerable ExceptBy(this IEnumerable first, Func firstKeySelector, IEnumerable second, Func secondKeySelector, IEqualityComparer keyComparer) { var keys = new HashSet(second.Select(secondKeySelector), keyComparer); var matchedKeys = new HashSet(); foreach (var element in first) { var key = firstKeySelector(element); if (!keys.Contains(key) && !matchedKeys.Contains(key)) { // Store the key so we only yield once matchedKeys.Add(key); yield return element; } } } public static Dictionary ToDictionaryIgnoreDuplicates(this IEnumerable src, Func keySelector) { var result = new Dictionary(); foreach (var item in src) { var key = keySelector(item); if (!result.ContainsKey(key)) { result[key] = item; } } return result; } public static Dictionary ToDictionaryIgnoreDuplicates(this IEnumerable src, Func keySelector, Func valueSelector) { var result = new Dictionary(); foreach (var item in src) { var key = keySelector(item); if (!result.ContainsKey(key)) { result[key] = valueSelector(item); } } return result; } public static void AddIfNotNull(this List source, TSource item) { if (item == null) { return; } source.Add(item); } public static bool Empty(this IEnumerable source) { return !source.Any(); } public static bool None(this IEnumerable source, Func predicate) { return !source.Any(predicate); } public static bool NotAll(this IEnumerable source, Func predicate) { return !source.All(predicate); } public static List SelectList(this IEnumerable source, Func predicate) { return source.Select(predicate).ToList(); } } }