Implementation of IEnumerator without using 'yield return'
我正在学习C语言中的迭代器概念,并在试验代码、处理简单问题并尝试以不同的方式实现。我尝试在列表中显示所有术语,因为我尝试了不同的方法来获得结果。在下面的代码中,我使用了两个类listirator和implementlist。
在ListIterator类中:我定义了一个哈希集,它使用IEnumerator存储值。这里getEnumerator()方法返回列表中的值。GetEnumerator在ImplementList类(其他类)中实现。最后,列表显示在控制台中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | public class ListIterator { public void DisplayList() { HashSet<int> myhashSet = new HashSet<int> { 30, 4, 27, 35, 96, 34}; IEnumerator<int> IE = myhashSet.GetEnumerator(); while (IE.MoveNext()) { int x = IE.Current; Console.Write("{0}", x); } Console.WriteLine(); Console.ReadKey(); } } |
在ImplementList类中,定义了getEnumerator(),它使用yield返回x返回列表。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | public class ImplementList : IList<int> { private List<int> Mylist = new List<int>(); public ImplementList() { } public void Add(int item) { Mylist.Add(item); } public IEnumerator<int> GetEnumerator() { foreach (int x in Mylist) yield return x; } } |
现在,我想重写getEnumerator(),而不使用yield return。它应该返回列表中的所有值。是否可以在不使用IEnumerator中的yield返回的情况下获取列表中的所有值?
您可以使用内部列表
1 2 3 4 | public IEnumerator<int> GetEnumerator() { return MyList.GetEnumerator(); } |
或者您可以自己实现IEnumerator(来自msdn):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | public class People : IEnumerable { private Person[] _people; public People(Person[] pArray) { _people = new Person[pArray.Length]; for (int i = 0; i < pArray.Length; i++) { _people[i] = pArray[i]; } } IEnumerator IEnumerable.GetEnumerator() { return (IEnumerator) GetEnumerator(); } public PeopleEnum GetEnumerator() { return new PeopleEnum(_people); } } public class PeopleEnum : IEnumerator { public Person[] _people; // Enumerators are positioned before the first element // until the first MoveNext() call. int position = -1; public PeopleEnum(Person[] list) { _people = list; } public bool MoveNext() { position++; return (position < _people.Length); } public void Reset() { position = -1; } object IEnumerator.Current { get { return Current; } } public Person Current { get { try { return _people[position]; } catch (IndexOutOfRangeException) { throw new InvalidOperationException(); } } } } |
这将以数组的形式返回结果
1 | return MyList.ToArray(); |
或者如果你想把它作为一个列表返回,为什么不只是
1 | return MyList; |