foreach
pourrait être plus rapide, puisque vous n'utilisez pas l'indexeur
foreach (var value in dic.Values)
Debug.Writeline(value)
En outre, dans la mesure qui concerne la vitesse, Debug.Writeline
est probablement pas la meilleure option (ce que vous allez faire avec 2 millions d'entrées de trace de débogage de toute façon ??). Pensez à écrire dans un fichier, une base de données, etc.
EDIT regardant réflecteur, trouver une valeur dans un SortedDictionry se résume à une recherche binaire:
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;
}
La mise en œuvre de l'itération de SortedDictionary semble un peu plus impliqués:
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;
}
Il semble maintenir une pile dont l'élément supérieur est le plus petit (ou plus, selon la direction) un, et donc toujours celui à sauté et est retourné au cours iter ation. Je n'ai fait aucune analyse de complexité, mais il est forcément beaucoup plus efficace que d'exécuter une recherche binaire à chaque fois.