Accéder à une clé Dictionary.Keys via un index numérique

J'utilise un Dictionary<string, int> où le int est un décompte de la clé.

Maintenant, je dois accéder à la dernière clé insérée dans le dictionnaire, mais je ne connais pas son nom. La tentative évidente :

int LastCount = mydict[mydict.keys[mydict.keys.Count]];

ne fonctionne pas, car Dictionary.Keys n'implémente pas d'indexeur [].

Je me demande simplement s'il existe une classe similaire ? J'ai pensé à utiliser une pile, mais cela ne stocke qu'une chaîne. Je pourrais maintenant créer ma propre structure, puis utiliser un Stack<MyStruct>, mais je me demande s'il existe une autre alternative, essentiellement un dictionnaire qui implémente un indexeur [] sur les clés ?

请先 登录 后评论

5 réponses

lomaxx

Je ne sais pas si cela fonctionnerait car je suis à peu près sûr que les clés ne sont pas stockées dans l'ordre dans lequel elles sont ajoutées, mais vous pouvez convertir KeysCollection en une liste, puis obtenir la dernière clé de la liste ... mais ça vaudrait la peine d'y jeter un œil.

La seule autre chose à laquelle je peux penser est de stocker les clés dans une liste de recherche et d'ajouter les clés à la liste avant de les ajouter au dictionnaire... ce n'est pas joli quand même.

请先 登录 后评论
Juan

Je pense que vous pouvez faire quelque chose comme ça, la syntaxe est peut-être erronée, je n'ai pas utilisé C

请先 登录 后评论
Stephen Pellicer

Je suis d'accord avec la deuxième partie de la réponse de Patrick. Même si dans certains tests, il semble conserver l'ordre d'insertion, la documentation (et le comportement normal des dictionnaires et des hachages) indique explicitement que l'ordre n'est pas spécifié.

Vous demandez juste des ennuis en fonction de l'ordre des clés. Ajoutez votre propre comptabilité (comme l'a dit Patrick, une seule variable pour la dernière clé ajoutée) pour être sûr. Aussi, ne soyez pas tenté par toutes les méthodes telles que Last et Max sur le dictionnaire car elles sont probablement en relation avec le comparateur clé (je n'en suis pas sûr).

请先 登录 后评论
Calanus

Pourquoi ne pas simplement étendre la classe du dictionnaire pour ajouter une dernière propriété insérée dans la clé. Quelque chose comme ce qui suit peut-être ?

public class ExtendedDictionary : Dictionary<string, int>
{
    private int lastKeyInserted = -1;

    public int LastKeyInserted
    {
        get { return lastKeyInserted; }
        set { lastKeyInserted = value; }
    }

    public void AddNew(string s, int i)
    {
        lastKeyInserted = i;

        base.Add(s, i);
    }
}
请先 登录 后评论
Community

Un dictionnaire est une table de hachage, vous n'avez donc aucune idée de l'ordre d'insertion !

Si vous voulez connaître la dernière clé insérée, je suggérerais d'étendre le dictionnaire pour inclure une valeur LastKeyInserted.

Par exemple :

public MyDictionary<K, T> : IDictionary<K, T>
{
    private IDictionary<K, T> _InnerDictionary;

    public K LastInsertedKey { get; set; }

    public MyDictionary()
    {
        _InnerDictionary = new Dictionary<K, T>();
    }

    #region Implementation of IDictionary

    public void Add(KeyValuePair<K, T> item)
    {
        _InnerDictionary.Add(item);
        LastInsertedKey = item.Key;

    }

    public void Add(K key, T value)
    {
        _InnerDictionary.Add(key, value);
        LastInsertedKey = key;
    }

    .... rest of IDictionary methods

    #endregion

}

Vous rencontrerez cependant des problèmes lorsque vous utiliserez .Remove(), donc pour surmonter cela, vous devrez conserver une liste ordonnée des clés insérées.

请先 登录 后评论
  • 27 abonnés
  • 0 favoris,532 Feuilleter
  • Michael Stum posée à 2023-03-17 15:22