44 votes

Quelle est la différence entre les propriétés Keys et AllKeys sur une NameValueCollection?

System.Collections.Specialized.NameObjectCollectionBase a deux propriétés similaires:

   string[] AllKeys
  NameObjectCollectionBase.KeyCollection Keys
 

Fournissent-ils différents ensembles de données? Quand voudrais-je utiliser l'un sur l'autre?

61voto

Neil Williams Points 6446

AllKeys est O(n) , tandis que les Keys est O(1). C'est parce qu' AllKeys copie les clés dans un nouveau tableau, alors que Keys seulement renvoie une référence à l' NameValueCollection's de la clé privée de la collection. Donc au-delà de la différence de performance, la collection retournée par Keys va changer avec la collection de base que c'est juste une référence à l'original, AllKeys sera isolée de l'changements parce que c'est une copie.

Ce petit programme de test montre la différence de comportement:

using System;
using System.Collections.Specialized;

static class Program
{
    static void Main()
    {
        var collection = new NameValueCollection();

        var keys = collection.Keys;
        var allKeys = collection.AllKeys;

        collection.Add("Name", "Value");

        Console.WriteLine("Keys: " + keys.Count);
        Console.WriteLine("AllKeys: " + allKeys.Length);
        Console.ReadLine();
    }
}

La sortie est:

Keys: 1
AllKeys: 0

6voto

BFree Points 46421

Selon la documentation MSDN, lors de l'utilisation de AllKeys, il est O(n) pour récupérer toutes les valeurs, alors que lors de l'utilisation de Clés, il est O(1).

Touches

Récupération de la valeur de cette propriété est un O(1) opérations de

AllKeys

Cette méthode est un O(n), où n est le Comte.

Donc, fondamentalement, il semble que les Clés de meilleures performances.

5voto

Krypes Points 491

L'avantage supplémentaire est que vous pourrez effectuer des opérations sur votre collection en utilisant une instruction foreach ou LINQ lors du retour de AllKeys (). Comme il s'agit d'une copie, vous ne recevrez pas d'erreurs lors de la modification d'une liste en cours d'énumération.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X