using System.Collections;
using System.Collections.Generic;
public static void Main()
Random rand = new Random();
var names = "Bob,Biff,Bill".Split(',').Select(x=>x.Trim()).ToList();
var myList = new MyList<Person>();
myList.AddRange(names.Select(x=>new Person{Name = x, Age = rand.Next(20, 30)}));
foreach(var item in myList){
Console.WriteLine(item.Name + " " + item.Age);
using(var enumerator = myList.GetIndexedEnumerator()){
while(enumerator.MoveNext()){
var person = enumerator.Current;
Console.WriteLine("["+enumerator.Index+ "] "+person.Name+" "+person.Age);
public string Name{get;set;}
public class MyList<T> : List<T>{
public new IEnumerator<T> GetEnumerator(){
return new IndexedEnumerator<T>(base.GetEnumerator());
public static class Helpers{
public static IndexedEnumerator<T> GetIndexedEnumerator<T>(this IEnumerable<T> list){
return new IndexedEnumerator<T>(list.GetEnumerator());
public class BaseEnumerator<T> : IEnumerator<T>{
public BaseEnumerator(IEnumerator<T> enumer){
protected virtual IEnumerator<T> enumerator{get;set;}
protected virtual T current {get;set;}
public virtual bool MoveNext(){
return enumerator.MoveNext();
public virtual IEnumerator<T> GetEnumerator(){
public virtual T Current {get{return enumerator.Current;}}
object IEnumerator.Current {get{return enumerator.Current;}}
public virtual void Reset(){}
public virtual void Dispose(){}
public class IndexedEnumerator<T> : BaseEnumerator<T>
public IndexedEnumerator(IEnumerator<T> enumer):base(enumer){
public int Index {get; private set;}
public override bool MoveNext(){
Console.WriteLine("\tIndexedEnumerator, MoveNext was called");
return enumerator.MoveNext();