2014-04-20 46 views
0

我有以下類別:高級收集

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

而且我希望能夠與TextBase工作,如果它是的Word S,即集合遍歷它foreach,使用SelectAggregate方法。

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

這樣做的最好方法是什麼?

UPD:實施IEnumerable<Word>能解決我的問題的一部分,但現在當我打電話TextBase.Where()它將返回IEnumerable<Word>它會毀了我的基地段的細分,段成句子等等我能避免這種情況?

+1

入住這http://stackoverflow.com/questions/9455043/how-do-i-make-a-class-iterable – hgulyan

+0

@ user3554721你的意思是要拉平'TextBase'於上述列表'Word'? – dkozl

+0

@hgulyan謝謝。但看到UPD。 – 0x60

回答

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(); 
    } 
} 
+0

我相信它應該是'return((列表)this).SelectMany(ts => ts.SelectMany(s => s))。GetEnumerator();' –

+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); } 
    } 
} 
-2

爲什麼不加屬性?

public IEnumerable<Word> Words 
    { 
     get 
     { 
      // return all words somehow, maybe using yield 
     } 
    } 
+0

40分鐘前有這樣的答案 –