C#中集合的高级集合
本文关键字:集合 高级 | 更新日期: 2023-09-27 17:59:04
我有以下类:
class Word { }
class Sentence: List<Word> { }
class TextSection: List<Sentence> { }
class TextBase: List<TextSection> { }
我希望能够像处理Word
的集合一样处理TextBase
,即使用foreach
对其进行迭代,使用Select
和Aggregate
方法。
所有这些类中都有一些重要的附加字段和方法,因此用TextBase: List<Word>
替换它们不是一种选择。
最好的方法是什么?
UPD:实现IEnumerable<Word>
会解决我的部分问题,但现在当我调用TextBase.Where()
时,它会返回IEnumerable<Word>
。它会破坏我将基础分解为小节、小节分解为句子等的功能。我能避免这种情况吗?
如果TextBase
同时实现IEnumerable<TextSection>
(通过List)和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); }
}
}
您可以在TextBase:中实现IEnumerable
class TextBase: List<TextSection>, IEnumerable<Word>
{
IEnumerator<Word> IEnumerable<Word>.GetEnumerator()
{
return ((List<TextSection>)this).SelectMany(c => c.SelectMany(w => w)).GetEnumerator();
}
}
为什么不添加属性?
public IEnumerable<Word> Words
{
get
{
// return all words somehow, maybe using yield
}
}