2012-11-26 74 views
0

This is an excellent video解釋它是什麼和差異,但它似乎有一個根本的缺陷,你不能跳過列表;它甚至缺少一個Previous()方法。IEnumerator有什麼意義?

我發送了一個函數列表後,如果它發現了一個匹配,而不是原來的......下一個從下一個索引開始,我剛剛返回了在函數中找到下一個匹配的地方,因爲它已經完成了一個次循環來讀取每個'Hello'塊之間的所有行。

我不能用像IEnumerator這樣的迭代類來做任何事情;我錯過了什麼?

For row As Integer = 0 To dataList.Count - 1 
    If row <> -1 Then 
     If dataList.Item(row) = "Hello" Then row = SayHello(row) 
    End If 
Next 
+0

什麼'dataList'? ASP.NET控件沒有「Item」,而是「Items」屬性。這個問題很難理解。 –

+0

@TimSchmelter:是什麼讓你認爲這是與ASP.NET打交道? (在任何情況下,這都沒有關係) –

+0

@AdamRobinson:我問過究竟是什麼類型來理解這個理論問題背後的真正問題。 –

回答

2

你不能繞列表

跳過你說,這是一個缺陷。這不是當你不想在列表中跳過時。

人們用列表做的第一件事是迭代他們 - 這是所有類型集合的最低公分母。

如果您確實需要跳過,如您的示例中所示,請勿使用IEnumerator

+0

我明白,IEnumerator只是一個記住狀態的posh循環計數器,但如果沒有Previous()方法等,那麼這是一種無用的方法,可以針對...... next或for ... each進行復制。 *警告:我是一個偶然的編碼員,所以扮演魔鬼的擁護者;) – Data

+1

@Data:'IEnumerator'是'foreach'實現的主要方式。有些類型不提供對包含元素的隨機訪問,如'Dictionary'或'HashSet'。但是,這些仍然可以列舉。 –

0

接口的目的(以及附帶的IEnumerable接口)是爲迭代集合(或類似結構)提供只向前機制。鑑於這一點,我認爲公平地說它存在一個「根本性缺陷」,因爲你不能跳過或反過來說公平,因爲說小型車有一個基本的缺陷,因爲你可以'用它來運輸大型農場動物。

或者,對於那些不喜歡汽車類比的人來說,這類似於說香蕉有一個根本性的缺陷,因爲它(在一個普通的,未凍結的狀態下)不能用來敲打指甲。

+0

你必須使用汽車比喻,呃;) – Oded

+0

@Oded:這是傳統;) –

0

枚舉的定義是逐一提及的事情。枚舉是從頂部開始,查看列表中的每個項目。這是枚舉。所以,可以枚舉的東西是你可以從頂部一個一個地看的東西。 IEnumerable這個名字非常合適。

0

IEnumerator的要點是一次只能提供一個對象,這意味着您可以節省內存和/或時間。要使用列表,您需要先填寫列表。即使你不需要完整的列表,但每次迭代時都要使用單個項目。

Private Iterator Function AllIntegers() As IEnumerable(Of Integer) 
    Dim i = Integer.MinValue 
    While i < Integer.MaxValue 
     Yield i 
    End While 
End Function 

現在你可以做

For each i in AllIntegers 

而現在試圖把所有這些整數到一個列表(整數)