diff --git a/ICD.Common.Utils/Extensions/EnumerableExtensions.cs b/ICD.Common.Utils/Extensions/EnumerableExtensions.cs index 2254198..8bdfd6c 100644 --- a/ICD.Common.Utils/Extensions/EnumerableExtensions.cs +++ b/ICD.Common.Utils/Extensions/EnumerableExtensions.cs @@ -1542,20 +1542,20 @@ namespace ICD.Common.Utils.Extensions return Consolidate(extends, EqualityComparer.Default); } - /// - /// Skips duplicate, consecutive items. - /// E.g. - /// [1, 2, 2, 3, 1, 1] - /// Becomes - /// [1, 2, 3, 1] - /// - /// - /// + /// + /// Skips duplicate, consecutive items. + /// E.g. + /// [1, 2, 2, 3, 1, 1] + /// Becomes + /// [1, 2, 3, 1] + /// + /// + /// /// /// [PublicAPI] public static IEnumerable Consolidate([NotNull] this IEnumerable extends, - [NotNull] IEqualityComparer comparer) + [NotNull] IEqualityComparer comparer) { if (extends == null) throw new ArgumentNullException("extends"); @@ -1563,33 +1563,72 @@ namespace ICD.Common.Utils.Extensions if (comparer == null) throw new ArgumentNullException("comparer"); - return ConsolidateIterator(extends, comparer); + return extends.Consolidate(e => e, comparer); } - /// - /// Skips duplicate, consecutive items. - /// E.g. - /// [1, 2, 2, 3, 1, 1] - /// Becomes - /// [1, 2, 3, 1] - /// - /// - /// + /// + /// Skips duplicate, consecutive items. + /// E.g. + /// [1, 2, 2, 3, 1, 1] + /// Becomes + /// [1, 2, 3, 1] + /// + /// + /// + /// + /// + /// + [PublicAPI] + public static IEnumerable Consolidate([NotNull] this IEnumerable extends, + [NotNull] Func predicate) + { + if (extends == null) + throw new ArgumentNullException("extends"); + + if (predicate == null) + throw new ArgumentNullException("predicate"); + + return extends.Consolidate(predicate, EqualityComparer.Default); + } + + /// + /// Skips duplicate, consecutive items. + /// E.g. + /// [1, 2, 2, 3, 1, 1] + /// Becomes + /// [1, 2, 3, 1] + /// + /// + /// + /// + /// /// /// - private static IEnumerable ConsolidateIterator([NotNull] IEnumerable sequence, - [NotNull] IEqualityComparer comparer) + [PublicAPI] + public static IEnumerable Consolidate([NotNull] this IEnumerable extends, + [NotNull] Func predicate, + [NotNull] IEqualityComparer comparer) { - bool first = true; - T last = default(T); + if (extends == null) + throw new ArgumentNullException("extends"); - foreach (T item in sequence) + if (predicate == null) + throw new ArgumentNullException("predicate"); + + if (comparer == null) + throw new ArgumentNullException("comparer"); + + bool first = true; + TValue last = default(TValue); + + foreach (TKey item in extends) { - if (!first && comparer.Equals(last, item)) + TValue value = predicate(item); + if (!first && comparer.Equals(last, value)) continue; first = false; - last = item; + last = value; yield return item; }