簡體   English   中英

C#中的高級集合收藏

[英]Advanced collection of collections in C#

我有以下課程:

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

而且我希望能夠與工作TextBase ,如果它是一個集Word S,即疊代用foreach ,使用SelectAggregate方法。

所有這些類中都有一些重要的附加字段和方法,因此用TextBase: List<Word>替換它們TextBase: List<Word>不是一個選擇。

最好的方法是什么?

UPD:實現IEnumerable<Word>將解決部分問題,但是現在當我調用TextBase.Where() ,它將返回IEnumerable<Word>這將使我的基礎分解成段,將段分解成句子,等等。我可以避免這種情況?

如果您具有TextBase實現IEnumerable<TextSection> (通過List)和IEnumerable<Word> IEnumerable<TextSection> ,則使用LINQ會很IEnumerable<TextSection> ,因為您將必須在每個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
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM