簡體   English   中英

如何創建范圍有限的子枚舉器?

[英]How to create sub-enumerator with limited scope?

假設我有100個元素的集合。 常規枚舉器將迭代這100個元素。

我想創建枚舉器(它基於常規枚舉器,即它不是每個集合,而是一個,一般方法),其范圍從“hehe”到“there” - 我可以例如迭代僅中間超過20個元素。

void foo(IEnumerable<int> coll)
{
   var regular_iter = coll.GetEnumerator();
   regular_iter.MoveNext();
   regular_iter.MoveNext();
   // ... 8 more
   var scoped_iter = new ScopeEnumerator(regular_iterator,20);

所以在這種情況下,當我調用“scoped_iter.Reset()”時,它會重置為0元素(整個集合的第10個元素)。

而且它“只看到”了10-30的元素。

問題是 - 如何實現這樣的枚舉器?

編輯

1。

我需要來自“here”的迭代器,而不是“那里”,因為進入“那里”可能非常耗時。 然而,這實際上是次要的,最有問題的是Reset方法。

2。

喬恩詢問了背景。 我真正想要實現的是切片集合(即你有 - 比方說 - 10個字符串的集合,但你想把它解釋為5個元素的集合,每個元素是2個字符串的集合)。 朴素算法非常簡單,但效率也很低。 收集~16MB(字符串列表)我雖然有另一種方法 - 只需重新解釋數據,而不復制它。 所以我會創建一個迭代器,從整個集合中選擇每個SIZE_OF_SLICE元素,我也會創建這個作用域迭代器,它將從第一個迭代器開始,然后轉到SIZE_OF_SLICE元素。

這樣就可以重新使用數據,唯一的區別就是你如何迭代數據。 切片就足夠了,它應該很快。

3

我為IList實現了有效的切片(一旦你假設你有索引器,它就是小菜一碟)但它讓我感到不安,你不能(?)為列表(LinkedList)和數組(List)提供通用的高效算法。 因此,如果您正在閱讀本文並了解如何操作,請不要猶豫回答,即使在10年后(假設C#仍然在我們身邊)。

要獲得只能看到元素10-30的迭代器,請使用original.Skip(10).Take(20) ,盡管我認為你不能使用Reset

如果你需要能夠重置它,只需使用類似的東西

original.Skip(10).Take(20).ToArray()

為了用最小的努力做到這一點,你基本上填充的集合,其支持Reset (如List<T>與迭代器,然后返回。

懶惰地做這個有點棘手 - 即第一次迭代時,填充一個集合。 首次重置后,進入“重播”模式。 我確信它是可行的 - 它只是有點棘手。

如果你不得不支持僅在(比方說)15個元素之后第一次重置,那么當你第二次擊中第16個元素,返回到原始迭代器時,這將更加棘手。 讓人驚訝。

如果你可以確切地確定你的要求,那么實施它可能是一件有趣的事情......

編輯:只是將一些注釋寫入這個答案: 一般情況下,如果不復制數據,就不能這樣做,因為不能保證迭代器完全支持重置。 試想一下,如果迭代器是由一些隨機數發生器提供的數據,或者是一個未被記錄直播-顯然重播數據, 有事必須將其復制。

如果你有一個特定的源實現 ,那可能會有所不同 - 但你不能通過IEnumerator<T>接口來實現。

暫無
暫無

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

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