C# 子对象的收益率
我有一个项目“部分”列表,其中有一个getter和一个setter。每个“部分”都有一个“项目”列表。我想提供一个yield-return属性,将“Items”属性公开为包含类上的IEnumerable。我就是不太懂语法。我需要在这里再做一个循环吗?还是会重复太多次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
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的更多信息