foreach
может быть быстрее, так как вы не используете индексатор
foreach (var value in dic.Values)
Debug.Writeline(value)
Кроме того, что касается скорости, Debug.Writeline
, вероятно, не лучший вариант (что вы будете делать с 2 миллионами записей трассировки отладки в любом случае ??). Рассмотрите возможность записи в файл, базу данных и т. Д.
РЕДАКТИРОВАТЬ Глядя на отражатель, поиск значения в SortedDictionry сводится к двоичному поиску:
internal virtual Node<T> FindNode(T item)
{
int num;
for (Node<T> node = this.root; node != null; node = (num < 0) ? node.Left : node.Right)
{
num = this.comparer.Compare(item, node.Item);
if (num == 0)
{
return node;
}
}
return null;
}
Реализация итерации SortedDictionary кажется немного более сложной:
public bool MoveNext()
{
this.tree.VersionCheck();
if (this.version != this.tree.version)
{
ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_EnumFailedVersion);
}
if (this.stack.Count == 0)
{
this.current = null;
return false;
}
this.current = this.stack.Pop();
SortedSet<T>.Node item = this.reverse ? this.current.Left : this.current.Right;
SortedSet<T>.Node node2 = null;
SortedSet<T>.Node node3 = null;
while (item != null)
{
node2 = this.reverse ? item.Right : item.Left;
node3 = this.reverse ? item.Left : item.Right;
if (this.tree.IsWithinRange(item.Item))
{
this.stack.Push(item);
item = node2;
}
else
{
if ((node3 == null) || !this.tree.IsWithinRange(node3.Item))
{
item = node2;
continue;
}
item = node3;
}
}
return true;
}
Кажется, он поддерживает стек, верхний элемент которого является наименьшим (или самым большим, в зависимости от направления) и, таким образом, всегда тот, который должен быть извлечен и возвращен во время итерации. Я не делал никакого анализа сложности, но он должен быть значительно эффективнее, чем каждый раз выполнять бинарный поиск.