-
Notifications
You must be signed in to change notification settings - Fork 5.3k
Closed as not planned
Labels
Milestone
Description
The current implementation of Distinct uses a HashSet to verify if the item exists, on collections that we know that is "pure ordered" this approach is a little bit memory inefficient
"Pure ordering" means that always equal elements will be side by side, like [1,1,2,2,3,3,3,3,4], and instead of the "costly" HashSet implementation, we can simply verify if the last element returned is different than the current
Like that:
public static IEnumerable<T> PureOrderedDistinct<T>(IOrderedEnumerable<T> pureOrdered)
{
using var enumerator = pureOrdered.GetEnumerator();
if (!enumerator.MoveNext())
{
yield break;
}
var lastReturnedItem = enumerator.Current;
yield return lastReturnedItem;
while (enumerator.MoveNext())
{
var currentItem = enumerator.Current;
if (!EqualityComparer<T>.Default.Equals(lastReturnedItem, currentItem))
{
lastReturnedItem = currentItem;
yield return lastReturnedItem;
}
}
}