2011-02-19 60 views
5

我注意到很多迭代器或數據讀取器只是像DataReaderXmlReader,IEnumerator,任何更多(你有這個想法)爲什麼只有大部分時間纔會遍歷?

所以簡單地問他們爲什麼他們只轉發通常當我創建一個數據迭代器爲我的自定義需要我通常嘗試添加對導航雙方的支持。我同意大多數時候我們不需要反向遍歷,但有時候我們確實需要,所以最終我們需要創建temp變量或某些東西來保存數據。


所以我的問題是:

  • 爲什麼大多數數據迭代器只向前

  • 我錯了創造一個落後穿越的迭代器/數據讀取器。如果不是爲什麼框架沒有爲其內置的數據迭代器提供這種支持。

  • 我們有任何嚴重性能缺點或者它只是視爲好的設計有這樣的功能。


這個問題已經竊聽了我很多,從開始,但一直沒有得到滿意的答覆,所以我要求它做這兒過得相信很多開發商可能會同意我的說法向後遍歷可能是有用的,有時。

回答

9

「僅轉發」是:

  • 對於大多數消費者
  • 實現簡單最常見的用途,所以最有可能大多數生產者
  • 我們唯一實現可以保證,如果我們假設我們不想緩衝內存中的所有數據
  • 容易緩衝以允許隨機訪問(適用於中等大小的數據)

例如,如果您正在從數據庫,網絡流等中讀取數據,則只能保證「轉發」。我們當然不想任意緩衝所有的數據 - 它可能是巨大的

如果客戶認爲他們有足夠的數據量,他們總是可以調用ToList()等緩衝它在內存中,並允許隨機訪問。

例如,考慮這完全有效序列:

public static IEnumerable<int> LotsOfData() { 
    var random = new Random(); 
    while(true) yield return random.Next(); 
} 
  • 它不能沒有緩衝顛倒
  • 它的長度是無限的,因此不能被緩衝

很明顯,這個例子有點不太可能,但是從套接​​字,數據庫甚至是大文件讀取 - 可以是ess大致相同的情況。

+0

在這種情況下,你肯定是正確的,但即使從一個大文件中讀取數據,如果我們稍微向後讀一點,可能會出現問題。邏輯將像是將指針反向移動一些,然後再讀取。當然我們需要編寫更多的代碼......所以在這種設計中會出現什麼問題呢? –

+0

那麼這個想法是有一個通用的基本方法,適用於(基本上)的一切。沒有什麼能阻止你在特殊情況下使用其他訪問方案(如向後讀取或隨機訪問) – Foxfire

+0

基本SRP :)。不要將非必要的功能添加到對象。另外 - 我喜歡子彈4.如果你需要它,很容易添加緩衝。 – Goran

相關問題