关于c#:IEnumerator的实现,不使用’yield return’

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返回的情况下获取列表中的所有值?


您可以使用内部列表MyList的枚举器实现:

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;