我有一个项目列表('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
}
}
}
答案 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);
}
}