sobota, 19 stycznia 2013

Dzielenie listy na części (chunk)

Tyle razy już pisałem metodę dzielącą listę (IEnumerable) na części, że postanowiłem zamieścić kod od razu na blogu. Przypuszczam, że jeszcze niejeden raz będę musiał napisać ten sam kod.
public const int MaxHandles =64;
public static IEnumerable<IEnumerable<T>> DivideIntoChunks<T>(IEnumerable<T> iEnumerable )
{
  return iEnumerable
  .Select((x, i) => new { Index = i, Value = x })
  .GroupBy(x => x.Index / MaxHandles)
  .Select(x1 => x1.Select(x2 => x2.Value))
  ;
}

To jeszcze zamieszczę testy:
[TestCase(1, 1, 1)]
[TestCase(64, 1, 64)]
[TestCase(65, 2, 64)]
[TestCase(128, 2, 64)]
[TestCase(129, 3, 64)]
[TestCase(0, 0, 0)]
public void It_should_divide_into_chunks(int listNumber, int numberOfChunks, int firstChunkCount)
{
 var list = Enumerable.Repeat(1, listNumber);
 var listOfChunks = Generator.DivideIntoChunks(list);
 Assert.AreEqual(numberOfChuncks, listOfChunks.Count());
 Assert.AreEqual(firstChunkCount, listOfChunks.First().Count());
 Assert.AreEqual(listNumber, listOfChunks.SelectMany(x => x).Count());
}




Brak komentarzy:

Prześlij komentarz