PageRenderTime 55ms CodeModel.GetById 19ms RepoModel.GetById 1ms app.codeStats 0ms

/Main/src/DynamicDataDisplay/Common/Auxiliary/IEnumerableExtensions.cs

#
C# | 137 lines | 94 code | 24 blank | 19 comment | 4 complexity | 66beb93291bf48290676acad713b70f4 MD5 | raw file
Possible License(s): CC-BY-SA-3.0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Collections;
  6. namespace Microsoft.Research.DynamicDataDisplay.Common.Auxiliary
  7. {
  8. /// <summary>
  9. /// Contains extension methods for IEnumerable.
  10. /// </summary>
  11. public static class IEnumerableExtensions
  12. {
  13. /// <summary>
  14. /// Gets the value indicating wheter count of elements in a given sequence is greater or equal than specified value.
  15. /// </summary>
  16. /// <typeparam name="T"></typeparam>
  17. /// <param name="enumerable">The enumerable.</param>
  18. /// <param name="count">The count.</param>
  19. /// <returns></returns>
  20. public static bool CountGreaterOrEqual<T>(this IEnumerable<T> enumerable, int count)
  21. {
  22. int counter = 0;
  23. using (var enumerator = enumerable.GetEnumerator())
  24. {
  25. while (counter < count && enumerator.MoveNext())
  26. {
  27. counter++;
  28. }
  29. }
  30. return counter == count;
  31. }
  32. /// <summary>
  33. /// Splits the specified source sequnce into a sequence of sequences, with the length of inner sequence not longer than
  34. /// specified maximal count.
  35. /// </summary>
  36. /// <typeparam name="T"></typeparam>
  37. /// <param name="source">The source.</param>
  38. /// <param name="maxCount">The max count.</param>
  39. /// <returns></returns>
  40. public static IEnumerable<IEnumerable<T>> Split<T>(this IEnumerable<T> source, int maxCount)
  41. {
  42. using (var enumerator = new FixedEnumeratorWrapper<T>(source.GetEnumerator()))
  43. {
  44. do
  45. {
  46. var enumerable = new FixedEnumerable<T>(enumerator);
  47. yield return enumerable.Take(maxCount);
  48. }
  49. while (enumerator.CanMoveNext);
  50. }
  51. }
  52. private sealed class FixedEnumeratorWrapper<T> : IEnumerator<T>
  53. {
  54. private readonly IEnumerator<T> enumerator;
  55. public FixedEnumeratorWrapper(IEnumerator<T> enumerator)
  56. {
  57. this.enumerator = enumerator;
  58. }
  59. #region IEnumerator<T> Members
  60. public T Current
  61. {
  62. get { return enumerator.Current; }
  63. }
  64. #endregion
  65. #region IDisposable Members
  66. public void Dispose()
  67. {
  68. //enumerator.Dispose();
  69. }
  70. #endregion
  71. #region IEnumerator Members
  72. object IEnumerator.Current
  73. {
  74. get { return enumerator.Current; }
  75. }
  76. private bool canMoveNext = false;
  77. public bool CanMoveNext
  78. {
  79. get { return canMoveNext; }
  80. }
  81. public bool MoveNext()
  82. {
  83. canMoveNext = enumerator.MoveNext();
  84. return canMoveNext;
  85. }
  86. public void Reset()
  87. {
  88. enumerator.Reset();
  89. }
  90. #endregion
  91. }
  92. private sealed class FixedEnumerable<T> : IEnumerable<T>
  93. {
  94. private readonly IEnumerator<T> enumerator;
  95. public FixedEnumerable(IEnumerator<T> enumerator)
  96. {
  97. this.enumerator = enumerator;
  98. }
  99. #region IEnumerable<T> Members
  100. public IEnumerator<T> GetEnumerator()
  101. {
  102. return enumerator;
  103. }
  104. #endregion
  105. #region IEnumerable Members
  106. IEnumerator IEnumerable.GetEnumerator()
  107. {
  108. return enumerator;
  109. }
  110. #endregion
  111. }
  112. }
  113. }