Skip to content

Instantly share code, notes, and snippets.

@aruss
Last active December 21, 2015 10:19
Show Gist options
  • Save aruss/6291490 to your computer and use it in GitHub Desktop.
Save aruss/6291490 to your computer and use it in GitHub Desktop.
public static class EnumerableExtensions
{
public static IEnumerable<IEnumerable<TSource>> SplitWithRest<TSource>(this IEnumerable<TSource> source, params Func<TSource, bool>[] predicates)
{
var taken = new List<TSource>();
for (int i = 0, l = predicates.Length; i < l; i++)
{
var take = source.Where(predicates[i]);
taken.AddRange(take);
yield return take;
}
yield return source.Where(c => !taken.Contains(c));
}
}
[TestClass()]
public class EnumerableExtensionsTests
{
[TestMethod()]
public void SplitWithRestTest()
{
var set = new int[] { 0, 1, 2 };
var sets = set.SplitWithRest(
c => c == 0,
c => c == 1
).ToArray();
Assert.AreEqual(3, sets.Length);
var subset0 = sets[0].ToArray();
Assert.AreEqual(1, subset0.Length);
Assert.AreEqual(0, subset0[0]);
var subset1 = sets[1].ToArray();
Assert.AreEqual(1, subset1.Length);
Assert.AreEqual(1, subset1[0]);
var subset2 = sets[2].ToArray();
Assert.AreEqual(1, subset2.Length);
Assert.AreEqual(2, subset2[0]);
}
[TestMethod()]
public void SplitWithRestOverlapTest()
{
var set = new int[] { 0, 1, 2, 3, 4, 5 };
var sets = set.SplitWithRest(
c => c == 0,
c => c == 1,
c => c == 2 || c == 3,
c => c >= 3 && c < 5
).ToArray();
Assert.AreEqual(5, sets.Length);
var subset0 = sets[0].ToArray();
Assert.AreEqual(1, subset0.Length);
Assert.AreEqual(0, subset0[0]);
var subset1 = sets[1].ToArray();
Assert.AreEqual(1, subset1.Length);
Assert.AreEqual(1, subset1[0]);
var subset2 = sets[2].ToArray();
Assert.AreEqual(2, subset2.Length);
Assert.AreEqual(2, subset2[0]);
Assert.AreEqual(3, subset2[1]);
var subset3 = sets[3].ToArray();
Assert.AreEqual(2, subset3.Length);
Assert.AreEqual(3, subset3[0]);
Assert.AreEqual(4, subset3[1]);
var subset4 = sets[4].ToArray();
Assert.AreEqual(1, subset4.Length);
Assert.AreEqual(5, subset4[0]);
}
[TestMethod()]
public void SplitWithRestNoRestTest()
{
var set = new int[] { 0, 1, 2, 3, 4, 5 };
var sets = set.SplitWithRest(
c => c <= 2,
c => c > 2
).ToArray();
Assert.AreEqual(3, sets.Length);
var subset0 = sets[0].ToArray();
Assert.AreEqual(3, subset0.Length);
Assert.AreEqual(0, subset0[0]);
Assert.AreEqual(1, subset0[1]);
Assert.AreEqual(2, subset0[2]);
var subset1 = sets[1].ToArray();
Assert.AreEqual(3, subset1.Length);
Assert.AreEqual(3, subset1[0]);
Assert.AreEqual(4, subset1[1]);
Assert.AreEqual(5, subset1[2]);
var subset3 = sets[2].ToArray();
Assert.AreEqual(0, subset3.Length);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment