C#中的高级集合集合

时间:2014-04-20 20:11:16

标签: c# linq collections

我有以下课程:

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()它会毁掉我的基础细分,部分分为句子等我可以避免吗?

3 个答案:

答案 0 :(得分:1)

如果TextBase同时实现IEnumerable<TextSection>(通过列表)和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); }
    }
}

答案 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
        }
    }