View Single Post
Old Apr 30th, 2008, 1:58 PM   #9
mbd
Programmer
 
Join Date: Nov 2007
Posts: 86
Rep Power: 1 mbd is on a distinguished road
Re: populate array with random nonrepeating #'s

i suck at writing enumerables... i tried to use mine in a different program and found they needed to be modified. here they are:

Series.cs
c# Syntax (Toggle Plain Text)
  1. using System.Collections;
  2. using System.Collections.Generic;
  3.  
  4. namespace RandomEnumerable
  5. {
  6. public class Series : IEnumerable<int>
  7. {
  8. private readonly int begin, end;
  9.  
  10. public Series(int end)
  11. : this(0, end)
  12. {
  13. }
  14.  
  15. public Series(int begin, int end)
  16. {
  17. this.begin = begin;
  18. this.end = end;
  19. }
  20.  
  21. #region IEnumerable<int> Members
  22.  
  23. public IEnumerator<int> GetEnumerator()
  24. {
  25. return new Enumerator(begin, end);
  26. }
  27.  
  28. IEnumerator IEnumerable.GetEnumerator()
  29. {
  30. return new Enumerator(begin, end);
  31. }
  32.  
  33. #endregion
  34.  
  35. #region Nested type: Enumerator
  36.  
  37. private class Enumerator : IEnumerator<int>
  38. {
  39. private readonly int begin, end;
  40. private bool counting = false;
  41. private int current;
  42.  
  43. public Enumerator(int begin, int end)
  44. {
  45. this.begin = begin;
  46. this.end = end;
  47. }
  48.  
  49. #region IEnumerator<int> Members
  50.  
  51. public int Current
  52. {
  53. get { return current; }
  54. }
  55.  
  56. public void Dispose()
  57. {
  58. }
  59.  
  60. object IEnumerator.Current
  61. {
  62. get { return Current; }
  63. }
  64.  
  65. public bool MoveNext()
  66. {
  67. if (!counting)
  68. {
  69. current = begin;
  70. counting = true;
  71. }
  72. else
  73. {
  74. counting = ++current < end;
  75. }
  76. return counting;
  77. }
  78.  
  79. public void Reset()
  80. {
  81. counting = false;
  82. }
  83.  
  84. #endregion
  85. }
  86.  
  87. #endregion
  88. }
  89. }

RandomEnumerable.cs
c# Syntax (Toggle Plain Text)
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4.  
  5. namespace RandomEnumerable
  6. {
  7. public class RandomEnumerable<T> : IEnumerable<T>
  8. {
  9. private readonly IEnumerable<T> enumerable;
  10. private readonly Random random;
  11.  
  12. public RandomEnumerable(Random random, IEnumerable<T> enumerable)
  13. {
  14. this.random = random;
  15. this.enumerable = enumerable;
  16. }
  17.  
  18. #region IEnumerable<T> Members
  19.  
  20. IEnumerator<T> IEnumerable<T>.GetEnumerator()
  21. {
  22. return new Enumerator<T>(random, enumerable);
  23. }
  24.  
  25. IEnumerator IEnumerable.GetEnumerator()
  26. {
  27. return new Enumerator<T>(random, enumerable);
  28. }
  29.  
  30. #endregion
  31.  
  32. #region Nested type: Enumerator
  33.  
  34. private class Enumerator<T> : IEnumerator<T>
  35. {
  36. private readonly IEnumerable<T> enumerable;
  37. private readonly Random random;
  38. private int current;
  39. private List<T> list;
  40.  
  41. public Enumerator(Random random, IEnumerable<T> enumerable)
  42. {
  43. this.random = random;
  44. this.enumerable = enumerable;
  45. }
  46.  
  47. #region IEnumerator<T> Members
  48.  
  49. T IEnumerator<T>.Current
  50. {
  51. get { return list[current]; }
  52. }
  53.  
  54. void IDisposable.Dispose()
  55. {
  56. }
  57.  
  58. object IEnumerator.Current
  59. {
  60. get { return list[current]; }
  61. }
  62.  
  63. bool IEnumerator.MoveNext()
  64. {
  65. if (list == null)
  66. {
  67. list = new List<T>();
  68. list.AddRange(enumerable);
  69. }
  70. else
  71. {
  72. list.RemoveAt(current);
  73. }
  74. current = random.Next(0, list.Count);
  75. return list.Count > 0;
  76. }
  77.  
  78. void IEnumerator.Reset()
  79. {
  80. list = null;
  81. }
  82.  
  83. #endregion
  84. }
  85.  
  86. #endregion
  87. }
  88. }
mbd is offline   Reply With Quote