Skip to content

Instantly share code, notes, and snippets.

@sanbox-irl
Last active July 12, 2019 00:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sanbox-irl/1ffd4762d7776a7d48da4b7ca9f9786d to your computer and use it in GitHub Desktop.
Save sanbox-irl/1ffd4762d7776a7d48da4b7ca9f9786d to your computer and use it in GitHub Desktop.
Various methods for Enumerables.
using System.Collections;
using System.Collections.Generic;
public static class EnumerableUtility {
public static TupleEnumerable<T1, T2> CombinedEnumerable<T1, T2>(this (IEnumerable<T1>, IEnumerable<T2>) me, int count1, int count2) {
return new TupleEnumerable<T1, T2>(me.Item1, me.Item2, count1, count2);
}
public static TupleEnumerable<T1, T2> CombinedEnumerable<T1, T2>(this (IEnumerable<T1>, IEnumerable<T2>) me) {
return new TupleEnumerable<T1, T2>(me.Item1, me.Item2);
}
public class TupleEnumerable<T1, T2> : IEnumerable<(T1, T2)> {
public TupleEnumerable(IEnumerable<T1> enumerable1, IEnumerable<T2> enumerable2, int count1, int count2, bool lockstep = true) {
this.enumerable1 = enumerable1;
this.enumerable2 = enumerable2;
if (lockstep)
CheckCount(count1, count2);
}
public TupleEnumerable(IEnumerable<T1> enumerable1, IEnumerable<T2> enumerable2, bool lockstep = true) {
this.enumerable1 = enumerable1;
this.enumerable2 = enumerable2;
if (lockstep)
CheckCount(enumerable1.Count(), enumerable2.Count());
}
public IEnumerator<(T1, T2)> GetEnumerator() => new TupleEnumerator<T1, T2>(enumerable1, enumerable2);
IEnumerable<T1> enumerable1;
IEnumerable<T2> enumerable2;
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
void CheckCount(int count1, int count2) {
if (count1 != count2) {
throw new System.Exception("Enumberable 1 and Enumberable 2 are not of same length, but they should be.");
}
}
}
class TupleEnumerator<T1, T2> : IEnumerator<(T1, T2)> {
public TupleEnumerator(IEnumerable<T1> enumerable1, IEnumerable<T2> enumerable2) {
enumerator1 = enumerable1.GetEnumerator();
enumerator2 = enumerable2.GetEnumerator();
}
public (T1, T2) Current => (enumerator1.Current, enumerator2.Current);
public void Dispose() {
enumerator1.Dispose();
enumerator2.Dispose();
}
public bool MoveNext() {
return enumerator1.MoveNext() && enumerator2.MoveNext();
}
public void Reset() {
enumerator1.Reset();
enumerator2.Reset();
}
IEnumerator<T1> enumerator1;
IEnumerator<T2> enumerator2;
object IEnumerator.Current => Current;
}
static int Count(this IEnumerable me) {
var ret = 0;
foreach (var thisOne in me) {
ret++;
}
return ret;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment