子对象的收益率

本文关键字:收益率 对象 | 更新日期: 2023-09-27 18:28:51

我有一个项目列表("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
            }
        }
    }

子对象的收益率

您是正确的;额外的循环应该做你想做的事情-尽管你不会从调用代码中知道项目属于哪个部分。所以,如果这是一个要求,你可能需要重新思考你的代码。

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

您也可以使用SelectMany

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

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

此外,您可以使用Linq:将该房产打造成一条直线

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