Возвращение урожая над дочерними объектами - PullRequest
1 голос
/ 23 марта 2012

У меня есть список предметов («разделов»), в которых есть геттер и сеттер.Каждый из этих «разделов» имеет список «элементов».Я хотел бы предоставить свойство yield return, чтобы представить свойство «Items» как IEnumerable для содержащего класса.Я просто не могу понять синтаксис совершенно правильно.Мне нужен еще один цикл или он будет повторяться слишком много раз?

    public virtual IList<ISection> Sections{ get; set; }

    public virtual IEnumerable<IItem> Sections {
        get{
            foreach (var sect in Sections) {
                // will this iterate too many times if I add an additional loop?
                yield return sect.Items
            }
        }
    }

Ответы [ 3 ]

6 голосов
/ 23 марта 2012

Вы правы;дополнительный цикл должен делать то, что вы хотите - хотя из вызывающего кода вы не узнаете, к какому разделу принадлежит элемент.Поэтому, если это требование, вы можете переосмыслить свой код.

public virtual IEnumerable<IItem> Sections {
    get{
        foreach (var sect in Sections) {
            foreach (var item in sect.Items) {
                yield return item;
            }
        }
    }
3 голосов
/ 23 марта 2012

Вы также можете использовать SelectMany

public virtual IEnumerable<IItem> Sections 
{
    get { return Sections.SelectMany(s => s.Items); }
}
1 голос
/ 23 марта 2012

Как уже упоминалось, у вас не может быть двух свойств с одинаковым именем, которые возвращают разные типы. Вам нужно переименовать один из методов.

Кроме того, вы можете сделать свойство однострочным с Linq:

    public virtual IList<ISection> Sections { get; set; }

    public virtual IEnumerable<IItem> SectionItems
    {
        get {
            return Sections.SelectMany(sect => sect.Items);
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...