Last active
December 22, 2015 17:19
-
-
Save hazzik/6505469 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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