C#中集合的高级集合

本文关键字:集合 高级 | 更新日期: 2023-09-27 17:59:04

我有以下类:

class Word { }
class Sentence: List<Word> { }
class TextSection: List<Sentence> { }
class TextBase: List<TextSection> { }

我希望能够像处理Word的集合一样处理TextBase,即使用foreach对其进行迭代,使用SelectAggregate方法。

所有这些类中都有一些重要的附加字段和方法,因此用TextBase: List<Word>替换它们不是一种选择。

最好的方法是什么?

UPD:实现IEnumerable<Word>会解决我的部分问题,但现在当我调用TextBase.Where()时,它会返回IEnumerable<Word>。它会破坏我将基础分解为小节、小节分解为句子等的功能。我能避免这种情况吗?

C#中集合的高级集合

如果TextBase同时实现IEnumerable<TextSection>(通过List)和IEnumerable<Word>,那么使用LINQ将是一件痛苦的事情,因为您必须在每个LINQ方法中指定类型,如WhereSelect。最好创建一个类似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
        }
    }