Question about IEnumerable <T>

I noticed that IEnumerable (Generics) requires 2 methods to implement:

1. IEnumerator<T> GetEnumerator()

2. IEnumerable.GetEnumerator()Method

( http://msdn.microsoft.com/en-us/library/19e6zeyy.aspx )

What is # 2 and how should I define / implement this?

From my game with some code, it looks like IEnumerator GetEnumerator () is being called in a foreach loop. Where does # 2 IEnumerable.GetEnumerator work?

I went through recipe 6.1. Creating an iterator of a universal type in the Oreilly C # 3.0 Cookbook, and I got an error because # 2 was not implemented (it was not included in the recipe code).

Thank!

+3
source share
7 answers

- GetEnumerator, - . , -generic object.

- , -generic:

IEnumerator IEnumerable.GetEnumerator() {
   return GetEnumerator();
}
+9

IEnumerable , IEnumerable .

IEnumerable.GetEnumerator, ,

IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); /*generic method call*/ }
+2

# 2 - GetEnumerator IEnumerable. # 1 - GetEnumerator() IEnumerable<T>.

IEnumerable.GetEnumerator() , IEnumerable, ( IEnumerator).

+1

( String ), GetEnumerator GetEnumerator ( Object.)

class Foo : IEnumerable<string>
{
    public IEnumerator<string> GetEnumerator()
    {
        foreach (string value in new[] { "a", "b", "c" })
        {
            yield return value;
        }
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}
+1

- , .NET v1.1, generics.

, GetEnumerator()

IEnumerator IEnumerable.GetEnumerator()
{
     return GetEnumerator();
}
+1

, , . -

class FooCollection : IEnumerable<Foo>, IEnumerable
{
    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }

    public IEnumerator<Foo> GetEnumerator()
    {
        // return enumerator
    }
}

: IEnumerable , , , IEnumerable<T>, IEnumerable<T> IEnumerable.

0

, IEnumerable. , , 99% .

, , IEnumerable, GetEnumerator() , IEnumerator , foreach. Ienumerator , , "" ", , foreach" ". , Enumerator ( IEnumerator IEnumerator)

( PersonCollection)

public IEnumerator GetEnumerator() { return new myTypeEnumerator(this); }
public class myTypeEnumerator : IEnumerator
{
    int nIndex;
    PersonCollection pers;
    public myTypeEnumerator(PersonCollection myTypes) 
     { pers = myTypes; nIndex = -1; }
    public bool MoveNext() { return (++nIndex < pers.alPers.Count); }
    public object Current { get { return (pers[nIndex]); } }
    public void Reset() { nIndex = -1; }
}

, :

public IEnumerator<T> GetEnumerator() { return new myTypeEnumerator<T>(this); }
public class myTypeEnumerator<T> : IEnumerator<T>
{
    int nIndex;
    IList<T> tList;
    public myTypeEnumerator(IList<T> listOfTs) 
     { 
        tList = listOfTs; 
        nIndex = -1; 
     }
    public bool MoveNext() { return (++nIndex < tList.Count); }
    public T Current { get { return (tList[nIndex]); } }
    public void Reset() { nIndex = -1; }
}
0

Source: https://habr.com/ru/post/1753408/


All Articles