Last active
July 12, 2019 00:06
-
-
Save sanbox-irl/1ffd4762d7776a7d48da4b7ca9f9786d to your computer and use it in GitHub Desktop.
Various methods for Enumerables.
This file contains 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
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