Guest User

Untitled

a guest
Jul 22nd, 2018
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.83 KB | None | 0 0
  1. IEnumerable<Items> remainingItems = Items
  2. var results = new List<List<Items>>();
  3. var counter = 0;
  4. while (remainingItems.Any())
  5. {
  6. var result = new List<Item>();
  7. result.AddRange(remainingItems.TakeWhile(x => somePredicate(x, counter));
  8. results.Add(result);
  9. remainingItems = remainingItems.Skip(result.Count);
  10. counter++;
  11. }
  12.  
  13. while (remainingItems.Any())
  14. {
  15. var result = new List<Item>();
  16. result.AddRange(remainingItems.TakeWhile(x => somePredicate(x, counter));
  17. results.Add(result);
  18. remainingItems = remainingItems.Skip(result.Count).Memoize();
  19. counter++;
  20. }
  21.  
  22. remainingItems = remainingItems.Skip(result.Count).Memoize();
  23.  
  24. remainingItems.Any()
  25.  
  26. result.AddRange(remainingItems.TakeWhile(x => somePredicate(x, counter));
  27.  
  28. using MoreLinq.Experimental;
  29.  
  30. for(int i = 0 ; i < result.Count ; i++){
  31. //do some business logic and now i got X result
  32. i = i + X
  33. }
  34.  
  35. public static IEnumerable<IEnumerable<T>> Test<T>(IEnumerable<T> source)
  36. {
  37. var items = new List<T>();
  38.  
  39. foreach (T item in source)
  40. {
  41. items.Add(item);
  42.  
  43. if (!SomePredicate(item))
  44. {
  45. yield return items;
  46. items = new List<T>();
  47. }
  48. }
  49.  
  50. // if you want any remaining items to go into their own IEnumerable, even if there's no more fails
  51. if (items.Count > 0)
  52. {
  53. yield return items;
  54. }
  55. }
  56.  
  57. public static IEnumerable<IEnumerable<T>> PartitionBy<T>(this IEnumerable<T> sequence, Func<T, int, bool> predicate)
  58. {
  59. var block = new List<T>();
  60. int index = 0;
  61.  
  62. foreach (var item in sequence)
  63. {
  64. if (predicate(item, index++))
  65. {
  66. block.Add(item);
  67. }
  68. else if (block.Count > 0)
  69. {
  70. yield return block.ToList(); // Return a copy so the caller can't change our local list.
  71. block.Clear();
  72. }
  73. }
  74.  
  75. if (block.Count > 0)
  76. yield return block; // No need for a copy since we've finished using our local list.
  77. }
  78.  
  79. static void Main()
  80. { // 0 1 2 3 4 5 6 7 8 9
  81. var ints = new List<int> {0, 1, 0, 3, 4, 5, 0, 0, 8, 9};
  82.  
  83. var result = ints.PartitionBy(((item, index) => item == index)); // Items where value == index.
  84.  
  85. foreach (var seq in result)
  86. Console.WriteLine(string.Join(", ", seq));
  87.  
  88. // Output is:
  89. // 0, 1
  90. // 3, 4, 5
  91. // 8, 9
  92. }
  93.  
  94. class Indexer
  95. {
  96. public int Index;
  97. public bool Finished;
  98. }
  99.  
  100. public static IEnumerable<IEnumerable<T>> PartitionBy<T>(this IEnumerable<T> sequence, Func<T, int, bool> predicate)
  101. {
  102. var iter = sequence.GetEnumerator();
  103. var indexer = new Indexer();
  104.  
  105. while (!indexer.Finished)
  106. {
  107. yield return nextBlock(iter, predicate, indexer);
  108. }
  109. }
  110.  
  111. static IEnumerable<T> nextBlock<T>(IEnumerator<T> iter, Func<T, int, bool> predicate, Indexer indexer)
  112. {
  113. int index = indexer.Index;
  114. bool any = false;
  115.  
  116. while (true)
  117. {
  118. if (!iter.MoveNext())
  119. {
  120. indexer.Finished = true;
  121. yield break;
  122. }
  123.  
  124. if (predicate(iter.Current, index++))
  125. {
  126. any = true;
  127. yield return iter.Current;
  128. }
  129. else
  130. {
  131. indexer.Index = index;
  132.  
  133. if (any)
  134. yield break;
  135. }
  136. }
  137. }
  138.  
  139. IEnumerable<int> remainingItems = new[] { 1, 1, 2, 2, 2, 3, 4, 6, 7, 10, 12 };
  140. var results = new List<List<int>>();
  141. var counter = 0;
  142. var iterator = remainingItems.GetEnumerator();
  143. for (var done = !iterator.MoveNext();!done;)
  144. {
  145. var result = new List<int>();
  146. while (!done && SomePredicate( iterator.Current, counter ))
  147. {
  148. result.Add( iterator.Current );
  149. if (!iterator.MoveNext())
  150. done = true;
  151. }
  152. results.Add( result );
  153. counter++;
  154. }
Add Comment
Please, Sign In to add comment