2011-06-21 75 views
57

我想爲我的自定義集合(一棵樹)實現IEnumerable,所以我可以使用foreach來遍歷我的樹。但據我所知,foreach總是從集合的第一個元素開始。我想選擇foreach從哪個元素開始。是否有可能以某種方式更改從哪個foreach開始的元素?是否有可能從第一個使用foreach的元素開始迭代?

+0

我會遵循最簡單的原則:http://en.wikipedia.org/wiki/Principle_of_least_astonishment – ChaosPandion

+0

如果你不從第一個元素開始,你如何定義迭代器的行爲?當它到達序列的末尾時會發生什麼?它是否會返回到第一個元素並遍歷剩餘的元素? –

+0

@ ChaosPandion的評論是我正在處理這些問題的地方。 :) –

回答

101

是的。執行以下操作:

Collection<string> myCollection = new Collection<string>; 

foreach (string curString in myCollection.Skip(3)) 
    //Dostuff 

Skip是一個IEnumerable功能跳過然而,許多你指定開始在當前索引。在另一方面,如果你想使用前三,你會使用.Take

foreach (string curString in myCollection.Take(3)) 

這些甚至可以配對在一起,所以如果你只是想4-6的項目,你可以這樣做:

foreach (string curString in myCollection.Skip(3).Take(3)) 
+2

請注意,C#區分大小寫,所以這些都不會如圖所示工作... –

+0

良好的通話。 WTB自動完成(gahh不記得它的真實名稱)在stackoverflow;) – MoarCodePlz

+0

這實際上是跳過或它只是創建一個副本? I.E.將這兩個是不同的: '的foreach(列表行中rows.skip(1)){ 行[0] = 「newInfo」; }' vs 'for(int i = 1; i row = rows [i]; row [0] =「newStuff」; }' – TigerBear

4

您可以使用Enumerable.Skip跳過一些元素,並從那裏開始。

例如:

foreach(item in theTree.Skip(9)) // Skips the first 9 items 
{ 
    // Do something 

但是,如果你正在寫一棵樹,你可能要提供在樹上項目本身將返回一個新IEnumerable<T>它將從那裏下來枚舉的成員。從長遠來看,這可能會更有用。

+0

像'的IEnumerable 子樹(rootIndex)'?好決定! –

+0

謝謝你的回答,跳躍看起來很有希望,閱讀有關跳過MSDN信息,我得到了定論,也許有可能寫一個方法StartFrom(這IEnumerable的樹,MyTreeElement元),這將是IEnumerable的擴展方法,將返回的IEnumerable 我應該從中開始迭代。那麼也許我可以使用這個方法作爲foreach(var元素在tree.StartFrom(someElement)))。 – inferno

+0

@inferno:是的,你可以輕鬆地做到這一點。不過,我也只是一個方法/屬性添加到MyTreeElement這更像是:'的IEnumerable Children',所以你可以只是做:'的foreach(VAR在someElement.Children項)' - 比使用擴展方法更清晰IMO。 –

15

這是最容易使用在LINQ的Skip方法爲這個對象,跳過一個給定數目的元件:

foreach (var value in sequence.Skip(1)) // Skips just one value 
{ 
    ... 
} 

顯然只是改變1爲任何其它值跳過不同數量的元件.. 。

同樣,您可以使用Take來限制返回的元素的數量。

您可以在my Edulinq blog series中閱讀更多關於這兩種方法(以及相關的SkipWhileTakeWhile方法)。

+0

喬恩,沒有這一點,如果「序列」是空運行異常的風險? – WEFX

+0

@WEFX:嗯,我們不知道是否sequence''可以順理成章'null'與否。據推測OP可以自己處理 - 這不是問題的一部分...... –

-1

Foreach將以您實施IEnumerable所定義的方式迭代您的收藏。因此,儘管您可以跳過元素(如上所示),但您仍然在技術上按照相同順序迭代元素。

不知道你在努力達到什麼,但是你的班級可能有多個IEnumerable屬性,每個屬性都按特定順序枚舉元素。

相關問題