39 out of 62 rated this helpful - Rate this topic

IEnumerable Interface

Exposes the enumerator, which supports a simple iteration over a non-generic collection.

Namespace:  System.Collections
Assembly:  mscorlib (in mscorlib.dll)
[ComVisibleAttribute(true)]
[GuidAttribute("496B0ABE-CDEE-11d3-88E8-00902754C43A")]
public interface IEnumerable

For the generic version of this interface see System.Collections.Generic.IEnumerable<T>.

Notes to Implementers:

IEnumerable must be implemented to support the foreach semantics of Microsoft Visual Basic. COM classes that allow enumerators also implement this interface.

The following code example demonstrates the implementation of the IEnumerable and IEnumerator interfaces for a custom collection. In this example, members of these interfaces are not explicitly called, but they are implemented to support the use of foreach (For Each in Visual Basic) to iterate through the collection.

using System;
using System.Collections;

public class Person
{
    public Person(string fName, string lName)
    {
        this.firstName = fName;
        this.lastName = lName;
    }

    public string firstName;
    public string lastName;
}

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();
            }
        }
    }
}

class App
{
    static void Main()
    {
        Person[] peopleArray = new Person[3]
        {
            new Person("John", "Smith"),
            new Person("Jim", "Johnson"),
            new Person("Sue", "Rabon"),
        };

        People peopleList = new People(peopleArray);
        foreach (Person p in peopleList)
            Console.WriteLine(p.firstName + " " + p.lastName);

    }
}

/* This code produces output similar to the following:
 *
 * John Smith
 * Jim Johnson
 * Sue Rabon
 *
 */


Windows 7, Windows Vista, Windows XP SP2, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP Starter Edition, Windows Server 2008 R2, Windows Server 2008, Windows Server 2003, Windows Server 2000 SP4, Windows Millennium Edition, Windows 98, Windows CE, Windows Mobile for Smartphone, Windows Mobile for Pocket PC, Xbox 360, Zune

The .NET Framework and .NET Compact Framework do not support all versions of every platform. For a list of the supported versions, see .NET Framework System Requirements.

.NET Framework

Supported in: 3.5, 3.0, 2.0, 1.1, 1.0

.NET Compact Framework

Supported in: 3.5, 2.0, 1.0

XNA Framework

Supported in: 3.0, 2.0, 1.0
Did you find this helpful?
(1500 characters remaining)
Community Content Add
Annotations FAQ
Examples of the use of IEnumerable
Some examples about the use of 'IEnumerable' at: http://www.codeproject.com/KB/collections/Enumerators.aspx
OR you can just derive People from List&amp;lt;Person&amp;gt;
And it will work just fine.



//Added example for people like ~me~ who didn't realise this could be done until now (C.L.M.)
publicclassPeople : List<person>

{

//Any Overrides you want here...

}

Or You Could Reoginize this is an Example
But why are fields in the class declared as public? Do we like showing poor programming standards?
Refactored: generic list instead of object array, combined interfaces into one class, added indexer

using System;
using System.Collections;
using System.Collections.Generic;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
List<Person> peopleArray = new List<Person>()
{
new Person("John", "Smith"),
new Person("Jim", "Johnson"),
new Person("Sue", "Rabon"),
};

People peopleList = new People(peopleArray);
foreach (Person p in peopleList)
Console.WriteLine(p.firstName + " " + p.lastName);

Person p2 = peopleList[1]; //Jim Johnson
Console.WriteLine(p2.firstName + " " + p2.lastName);
}
}

public class Person
{
public Person(string firstName, string lastName)
{
this.firstName = firstName;
this.lastName = lastName;
}

public string firstName;
public string lastName;
}

public class People : IEnumerable, IEnumerator
{
private List<Person> people;
int position = -1;
public People(List<Person> list)
{
people = list;
}

public Person this[int indexer]
{
get { return people[indexer]; }
set { people[indexer] = value; }
}

public bool MoveNext()
{
position++;
return (position < people.Count);
}

public void Reset()
{
position = -1;
}

public object Current
{
get
{
try
{
return people[position];
}
catch (IndexOutOfRangeException)
{
throw new InvalidOperationException();
}
}
}

public IEnumerator GetEnumerator()
{
return new People(people);
}
}
}