我有以下课程:
class Word { }
class Sentence: List<Word> { }
class TextSection: List<Sentence> { }
class TextBase: List<TextSection> { }
我希望能够使用TextBase
,就好像它是Word
的集合,即使用foreach
进行迭代,使用Select
和{ {1}}方法。
所有这些类中都有一些重要的附加字段和方法,因此不能用Aggregate
替换它们。
最好的方法是什么?
UPD:实施TextBase: List<Word>
将解决我的部分问题,但现在当我致电IEnumerable<Word>
时,它会返回TextBase.Where()
它会毁掉我的基础细分,部分分为句子等我可以避免吗?
答案 0 :(得分:1)
如果TextBase
同时实现IEnumerable<TextSection>
(通过列表)和IEnumerable<Word>
,那么使用LINQ会很麻烦,因为您必须在每个LINQ方法中指定类型例如Where
和Select
。最好创建一个像Words
这样的属性,你可以使用它来迭代单词。
类似的东西:
class TextBase : List<TextSection>
{
public IEnumerable<Word> Words
{
get { return this.SelectMany(s => s.Words); }
}
}
class TextSection : List<Sentence>
{
public IEnumerable<Word> Words
{
get { return this.SelectMany(s => s); }
}
}
答案 1 :(得分:0)
您可以在TextBase中实现IEnumerable:
class TextBase: List<TextSection>, IEnumerable<Word>
{
IEnumerator<Word> IEnumerable<Word>.GetEnumerator()
{
return ((List<TextSection>)this).SelectMany(c => c.SelectMany(w => w)).GetEnumerator();
}
}
答案 2 :(得分:-2)
为什么不添加属性?
public IEnumerable<Word> Words
{
get
{
// return all words somehow, maybe using yield
}
}