儿童对象的收益率回报率

时间:2012-03-23 13:11:33

标签: c# .net c#-4.0 yield-return

我有一个项目列表('sections'),它有一个getter和一个setter。这些“部分”中的每一个都有一个“项目”列表。我想提供一个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 个答案:

答案 0 :(得分:6)

你是对的;额外的循环应该做你想要的 - 虽然你不会从调用代码知道该项属于哪个部分。因此,如果这是一项要求,您可能需要重新考虑您的代码。

public virtual IEnumerable<IItem> Sections {
    get{
        foreach (var sect in Sections) {
            foreach (var item in sect.Items) {
                yield return item;
            }
        }
    }

答案 1 :(得分:3)

您也可以使用SelectMany

public virtual IEnumerable<IItem> Sections 
{
    get { return Sections.SelectMany(s => s.Items); }
}

答案 2 :(得分:1)

如上所述,您不能拥有两个返回不同类型的同名属性。您需要重命名其中一种方法。

此外,您可以使用Linq:

使该属性成为一行
    public virtual IList<ISection> Sections { get; set; }

    public virtual IEnumerable<IItem> SectionItems
    {
        get {
            return Sections.SelectMany(sect => sect.Items);
        }
    }