mirror of
https://github.com/ICDSystems/ICD.Common.Utils.git
synced 2026-02-16 05:05:05 +00:00
feat: Enumerable.Consolidate extensions support predicates
This commit is contained in:
@@ -1542,20 +1542,20 @@ namespace ICD.Common.Utils.Extensions
|
|||||||
return Consolidate(extends, EqualityComparer<T>.Default);
|
return Consolidate(extends, EqualityComparer<T>.Default);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Skips duplicate, consecutive items.
|
/// Skips duplicate, consecutive items.
|
||||||
/// E.g.
|
/// E.g.
|
||||||
/// [1, 2, 2, 3, 1, 1]
|
/// [1, 2, 2, 3, 1, 1]
|
||||||
/// Becomes
|
/// Becomes
|
||||||
/// [1, 2, 3, 1]
|
/// [1, 2, 3, 1]
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <typeparam name="T"></typeparam>
|
/// <typeparam name="T"></typeparam>
|
||||||
/// <param name="extends"></param>
|
/// <param name="extends"></param>
|
||||||
/// <param name="comparer"></param>
|
/// <param name="comparer"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
[PublicAPI]
|
[PublicAPI]
|
||||||
public static IEnumerable<T> Consolidate<T>([NotNull] this IEnumerable<T> extends,
|
public static IEnumerable<T> Consolidate<T>([NotNull] this IEnumerable<T> extends,
|
||||||
[NotNull] IEqualityComparer<T> comparer)
|
[NotNull] IEqualityComparer<T> comparer)
|
||||||
{
|
{
|
||||||
if (extends == null)
|
if (extends == null)
|
||||||
throw new ArgumentNullException("extends");
|
throw new ArgumentNullException("extends");
|
||||||
@@ -1563,33 +1563,72 @@ namespace ICD.Common.Utils.Extensions
|
|||||||
if (comparer == null)
|
if (comparer == null)
|
||||||
throw new ArgumentNullException("comparer");
|
throw new ArgumentNullException("comparer");
|
||||||
|
|
||||||
return ConsolidateIterator(extends, comparer);
|
return extends.Consolidate(e => e, comparer);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Skips duplicate, consecutive items.
|
/// Skips duplicate, consecutive items.
|
||||||
/// E.g.
|
/// E.g.
|
||||||
/// [1, 2, 2, 3, 1, 1]
|
/// [1, 2, 2, 3, 1, 1]
|
||||||
/// Becomes
|
/// Becomes
|
||||||
/// [1, 2, 3, 1]
|
/// [1, 2, 3, 1]
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <typeparam name="T"></typeparam>
|
/// <typeparam name="TKey"></typeparam>
|
||||||
/// <param name="sequence"></param>
|
/// <typeparam name="TValue"></typeparam>
|
||||||
|
/// <param name="extends"></param>
|
||||||
|
/// <param name="predicate"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
[PublicAPI]
|
||||||
|
public static IEnumerable<TKey> Consolidate<TKey, TValue>([NotNull] this IEnumerable<TKey> extends,
|
||||||
|
[NotNull] Func<TKey, TValue> predicate)
|
||||||
|
{
|
||||||
|
if (extends == null)
|
||||||
|
throw new ArgumentNullException("extends");
|
||||||
|
|
||||||
|
if (predicate == null)
|
||||||
|
throw new ArgumentNullException("predicate");
|
||||||
|
|
||||||
|
return extends.Consolidate(predicate, EqualityComparer<TValue>.Default);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Skips duplicate, consecutive items.
|
||||||
|
/// E.g.
|
||||||
|
/// [1, 2, 2, 3, 1, 1]
|
||||||
|
/// Becomes
|
||||||
|
/// [1, 2, 3, 1]
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TKey"></typeparam>
|
||||||
|
/// <typeparam name="TValue"></typeparam>
|
||||||
|
/// <param name="extends"></param>
|
||||||
|
/// <param name="predicate"></param>
|
||||||
/// <param name="comparer"></param>
|
/// <param name="comparer"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
private static IEnumerable<T> ConsolidateIterator<T>([NotNull] IEnumerable<T> sequence,
|
[PublicAPI]
|
||||||
[NotNull] IEqualityComparer<T> comparer)
|
public static IEnumerable<TKey> Consolidate<TKey, TValue>([NotNull] this IEnumerable<TKey> extends,
|
||||||
|
[NotNull] Func<TKey, TValue> predicate,
|
||||||
|
[NotNull] IEqualityComparer<TValue> comparer)
|
||||||
{
|
{
|
||||||
bool first = true;
|
if (extends == null)
|
||||||
T last = default(T);
|
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;
|
continue;
|
||||||
|
|
||||||
first = false;
|
first = false;
|
||||||
last = item;
|
last = value;
|
||||||
|
|
||||||
yield return item;
|
yield return item;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user