子对象的收益率
本文关键字:收益率 对象 | 更新日期: 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);
}
}