public static class IEnurambleExtension
{
public static IEnumerable<TSource> DistinctBy<TSource, TKey>
(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
{
HashSet<TKey> keys = new HashSet<TKey>();
foreach (TSource element in source)
if (keys.Add(keySelector(element)))
yield return element;
}
public static IEnumerable<int> DistinctByReturnIndexes<TSource, TKey>
(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
{
HashSet<TKey> keys = new HashSet<TKey>();
int i = 0;
foreach (TSource element in source)
{
if (!keys.Add(keySelector(element)))
yield return i;
i++;
}
}
public static int FirstContainsWithIndex<TSource>
(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
{
int i = 0;
foreach (TSource element in source)
{
if (predicate(element))
return i;
i++;
}
return -1;
}
public static IEnumerable<int> ContainsReturnIndexes<TSource>
(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
{
int i = 0;
foreach (TSource element in source)
{
if (predicate(element))
yield return i;
i++;
}
}
public static void Print<TSource, TKey>
(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
{
foreach (TSource element in source)
Console.WriteLine(keySelector(element));
}
}