Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 子对象的收益率_C#_.net_C# 4.0_Yield Return - Fatal编程技术网

C# 子对象的收益率

C# 子对象的收益率,c#,.net,c#-4.0,yield-return,C#,.net,C# 4.0,Yield Return,我有一个项目“部分”列表,其中有一个getter和一个setter。每个“部分”都有一个“项目”列表。我想提供一个yield-return属性,将“Items”属性公开为包含类上的IEnumerable。我就是不太懂语法。我需要在这里再做一个循环吗?还是会重复太多次 public virtual IList<ISection> Sections{ get; set; } public virtual IEnumerable<IItem> 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;
            }
        }
    }

你是对的;额外的循环应该做你想做的事情——尽管你无法从调用代码中知道该项属于哪个部分。因此,如果这是一项要求,您可能需要重新考虑您的代码

public virtual IEnumerable<IItem> Sections {
    get{
        foreach (var sect in Sections) {
            foreach (var item in sect.Items) {
                yield return item;
            }
        }
    }
您也可以使用SelectMany

您也可以使用SelectMany


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

此外,还可以使用Linq将属性设置为一行:

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

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

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

此外,还可以使用Linq将属性设置为一行:

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

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

您还有一个名称冲突。我建议将第二个方法重命名为public virtual IEnumerable SectionItems,因为它返回的是public virtual IEnumerable。我建议将第二个方法重命名为public virtual IEnumerable SectionItems,因为它返回的是公共虚拟IEnumerable SectionItems。我喜欢使用Linq扩展的借口。您可以在此处获得有关SelectMany的更多信息我喜欢使用Linq扩展的借口。您可以在此处获得有关SelectMany的更多信息