En C# .NET 2.0, ce qui est un moyen facile de faire un foreach dans le sens inverse?
Permet de dire que j'ai un Dictionnaire de l'objet:
Dictionary myDictionary<int, SomeObject> = new Dictionary<string, SomeObject>();
Maintenant, je veux parcourir le dictionnaire dans l'ordre inverse. Je ne peux pas utiliser une simple boucle for car je ne sais pas les clés du dictionnaire. Un foreach est facile:
foreach (SomeObject object in myDictionary.Values)
{
//Do stuff to object
}
Mais comment puis-je faire cela dans le sens inverse?
Vous devez vous connecter pour publier un commentaire.
J'avais utiliser un SortedList au lieu d'un dictionnaire. Vous pouvez toujours y accéder par la Clé, mais vous pouvez y accéder par index.
Il est intéressant de noter qu'une liste triée des magasins de paires clé/valeur triés par clé uniquement.
Un dictionnaire ou toute autre forme de table de hachage n'a pas de commande. Donc ce que vous essayez de faire est inutile 🙂
Si vous en avez .NET 3.5, vous pouvez utiliser le .Reverse() la méthode d'extension sur IEnumerables. Par exemple:
En fait, en C# 2.0, vous pouvez créer votre propre itérateur qui traverse un conteneur dans le sens inverse. Ensuite, vous pouvez l'utiliser itérateur dans votre instruction foreach. Mais votre itérateur serait d'avoir un moyen de naviguer dans le conteneur en premier lieu. Si c'est un simple tableau, il pourrait aller en arrière comme ceci:
Mais bien sûr, vous ne pouvez pas faire cela avec un Dictionnaire car elle ne permet pas de mettre en œuvre IList ou fournit un indexeur. Dire qu'un Dictionnaire n'est pas a l'ordre n'est pas vrai: bien sûr, il a de l'ordre. Cet ordre peut même être utile si vous savez ce que c'est.
Pour une solution à votre problème: je dirais que copier les éléments d'un tableau, et d'utiliser la méthode ci-dessus de la traverser en sens inverse. Comme ceci:
La copie de vos valeurs à un tableau peut sembler une mauvaise idée, mais en fonction du type de valeur, il n'est pas vraiment mauvais. Vous êtes peut-être la copie des références!
Je suis d'accord avec @leppie, mais pensez que vous méritez une réponse à la question en général. Il se pourrait que vous vouliez dire pour la question de l'être en général, mais accidentellement pris une mauvaise structure de données. L'ordre des valeurs dans un dictionnaire doit être considéré comme spécifique à l'implémentation; selon la documentation, il est toujours le même ordre que les clés, mais cet ordre n'est pas spécifié en tant que bien.
De toute façon, il n'y a pas de moyen simple de faire
foreach
fonctionner en sens inverse. C'est du sucre syntaxique à l'aide de la classe de l'agent recenseur, et les agents recenseurs ne peuvent se déplacer que dans une seule direction. Techniquement, la réponse pourrait être "inverser la collection, puis énumérer", mais je pense que c'est un cas où vous aurez juste à utiliser un "arrière" pour la boucle:Si vous n'avez pas .NET 3.5 et donc l'Inverse de la méthode d'extension, vous pouvez mettre en place votre propre. Je suppose qu'il probablement génère un intermédiaire de la liste (si nécessaire) et le parcourt dans le sens inverse, quelque chose comme ce qui suit:
Qui serait un
Dictionary<int, SomeObject> myDictionary
, et vous le feriez par:La seule façon que je peux venir avec dans le .NET 2.0 est d'abord de copier toutes les valeurs d'une Liste dans l'ordre inverse de la liste, puis exécutez le foreach sur cette liste:
Si la commande est la plus importante, vous pourriez vous une Pile et de créer une structure pour stocker votre int, paire d'Objets.
Si vous voulez un type de dictionnaire de la collection, mais vous avez besoin pour maintenir l'ordre d'insertion, vous pouvez regarder dans les KeyedCollection
ici
Il s'agit d'une fusion entre un dictionnaire et une liste. De cette façon, vous pouvez accéder à des éléments de la collection par le biais de la clé ou de l'insertion d'index.
Le seul piège est si votre élément est stocké dans la collection a avoir une clé de type int. Si vous pouviez changer que pour une chaîne ou d'un autre type (Guid Mabye). Depuis la collecteUn seront à la recherche de la clé de 1 plutôt que de l'indice de 1.
Un standard
for
boucle serait le mieux. Vous n'avez pas à vous soucier de la charge de traitement de l'inversion de la collection.Vous pouvez utiliser le LINQ pour les Objets Énumérable.Reverse() fonction .NET 2.0 à l'aide de LinqBridge.
Littérale réponse: