Skip to content

Instantly share code, notes, and snippets.

@hazzik
Last active December 22, 2015 17:19
Show Gist options
  • Save hazzik/6505469 to your computer and use it in GitHub Desktop.
Save hazzik/6505469 to your computer and use it in GitHub Desktop.
public static class EnumerableEx
{
public static bool Any(this IEnumerable e)
{
using (var i = enumerable.GetEnumerator())
{
return i.MoveNext();
}
}
public static bool AllUnique<T>(this IEnumerable<T> e)
{
var set = new HasSet<T>();
// ReSharper disable once LoopCanBeConvertedToQuery
// see comments to this answer http://stackoverflow.com/a/5391327/259946
foreach(var item in e)
{
if (!set.Add(item)) return false;
}
return true;
}
}
public static class Zipper
{
public static IEnumerable<TResult> Zip<T1, T2, TResult>(IEnumerable<T1> e1, IEnumerable<T2> e2, Func<T1,T2,TResult> selector)
{
return e1.Zip(e2, selector);
}
public static IEnumerable<TResult> Zip<T1, T2, T3, TResult>(IEnumerable<T1> e1, IEnumerable<T2> e2, IEnumerable<T3> e3, Func<T1, T2, T3, TResult> selector)
{
//TODO: check nulls.
using (var i1 = e1.GetEnumerator())
using (var i2 = e2.GetEnumerator())
using (var i3 = e3.GetEnumerator())
{
while(i1.MoveNext() && i2.MoveNext() && i3.MoveNext())
{
yield return selector(i1.Current, i2.Current, i3.Current);
}
}
}
public static IEnumerable<TResult> Zip<T1, T2, T3, T4, TResult>(IEnumerable<T1> e1, IEnumerable<T2> e2, IEnumerable<T3> e3, IEnumerable<T4> e4, Func<T1, T2, T3, T4, TResult> selector)
{
//TODO: check nulls.
using (var i1 = e1.GetEnumerator())
using (var i2 = e2.GetEnumerator())
using (var i3 = e3.GetEnumerator())
using (var i4 = e4.GetEnumerator())
{
while(i1.MoveNext() && i2.MoveNext() && i3.MoveNext() && i4.MoveNext())
{
yield return selector(i1.Current, i2.Current, i3.Current, i4.Current);
}
}
}
public static IEnumerable<TResult> Zip<TResult>(Func<object[], TResult> selector, params IEnumerable<object>[] enumerables)
{
return Zip(selector, enumerables.AsEnumerable());
}
public static IEnumerable<TResult> Zip<TResult>(Func<object[], TResult> selector, IEnumerable<IEnumerable<object>> enumerables)
{
//TODO: check nulls
var iterators = enumerables.Select(e => e.GetEnumerator()).ToArray();
try
{
while (iterators.All(i => i.MoveNext()))
{
yield return selector(iterators.Select(i => i.Current).ToArray());
}
}
finally
{
foreach (var i in iterators)
{
i.Dispose();
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment