Реализация IEnumerable вопрос - PullRequest
1 голос
/ 21 декабря 2009

У меня есть 2 класса, и в классе Persons я хочу добавить возможность циклического обхода свойств имени коллекции Person с помощью цикла foreach, например:

foreach (string name in Persons.Names)
{
// do something
}

Как бы я это сделал?

Это мои занятия:

 class Person
    {
        public string Name
        {
            get;
            set;
        }

        public string Surname
        {
            get;
            set;
        }
    }

    class Persons : IEnumerable<Person>
    {
        List<Person> persons = new List<Person>();
        public IEnumerator<Person> GetEnumerator()
        {
            foreach (Person p in persons)
            {
                yield return p;
            }
        }

        System.Collections.IEnumerator IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }

        public IEnumerator<string> Names
        {
            // implement looping through Name property of Person class
        }

        public Persons()
        {

        }

        public void Add( Person p )
        {
            persons.Add(p);
        }

        public string this[int index]
        {
            get { return this[index]; }
        }
    }

Ответы [ 4 ]

7 голосов
/ 21 декабря 2009

Первый цикл может быть реализован примерно так:

foreach (Person p in Persons)
{
// do something with p.Name
}

Вы можете реализовать свойство примерно так:

public IEnumerator<string> Names
{
    get
    {
        foreach (Person p in persons)
        {
            yield return p.Name;
        }
    }
}

или используя Linq:

public IEnumerator<string> Names
{
    get
    {
        return persons.Select(p => p.Name);
    }
}
5 голосов
/ 21 декабря 2009
    public IEnumerable<string> Names
    {
        get
        {
            foreach (Person p in persons)
            {
                yield return p.Name;
            }
        }
    }
2 голосов
/ 21 декабря 2009

Это работает?

foreach (Person p in persons)
{
  yield return p.Name;
}

Приветствие Matthias

1 голос
/ 21 декабря 2009

Посмотрите на эту статью здесь и здесь , которая поможет вам в вашем вопросе и ситуации.

...