OrderedDictionary в PowerCollections предоставляет функцию «получить итератор, начиная с или до ключа», для которой требуется O (log N) времени, чтобы вернуть первое значение. Это позволяет очень быстро, скажем, сканировать 1000 элементов, которые находятся ближе к середине набора из 50 миллионов элементов (что с помощью SortedDictionary потребовало бы угадать начало или конец, оба из которых являются одинаково плохим выбором и потребовали бы итератор около 25 миллионов предметов). OrderedDictionary может сделать это только с 1000 повторяющимися элементами.
Существует проблема в OrderedDictionary, хотя и в том, что он использует yield, который вызывает производительность O (n ^ 2) и нехватку памяти при итерации набора из 50 миллионов элементов в 32-битном процессе. Для этого есть довольно простое решение, о котором я расскажу позже.