2010-11-02 19 views

Répondre

5

Un NameValueCollection peut récupérer des éléments par index (mais vous ne pouvez pas demander l'indice d'une clé ou d'un élément spécifique). Ainsi,

var coll = new NameValueCollection(); 
coll.Add("Z", "1"); 
coll.Add("A", "2"); 
Console.WriteLine("{0} = {1}", coll.GetKey(0), coll[0]); // prints "Z = 1" 

Cependant, il se comporte bizarrement (par rapport à un IDictionary) lorsque vous ajoutez un plusieurs fois sur la touche:

var coll = new NameValueCollection(); 
coll.Add("Z", "1"); 
coll.Add("A", "2"); 
coll.Add("Z", "3"); 
Console.WriteLine(coll[0]); // prints "1,3" 

Le comportement est bien documenté, cependant.

Attention: NameValueCollection ne pas mettre en œuvre IDictionary.


En aparté: Dictionary<K,V> n'a aucun index que vous pouvez utiliser, mais aussi longtemps que vous ajoutez que des éléments, et ne jamais supprimer, l'ordre des éléments est l'ordre d'insertion. Notez qu'il s'agit d'un détail de l'implémentation actuelle de Microsoft: la documentation indique explicitement que l'ordre est aléatoire, ce comportement peut donc changer dans les futures versions de .NET Framework ou Mono.

+0

ce qui est excellent. Une alternative à Hashtable et Dictionary qui est simple. En outre, la note sur l'ordre de tri par défaut de Dictionary est très utile. –

+0

Rappelez-vous d'ajouter: à l'aide System.Collections.Specialized; –

5

Si c'est quelque chose dont vous avez besoin de suivre efficacement, alors vous utilisez la mauvaise structure de données. Au lieu de cela, vous devez utiliser un SortedDictionary où la clé est marquée avec l'index de quand il a été ajouté (ou un horodatage) et un IComparer personnalisé qui compare deux clés en fonction de l'index (ou l'horodatage).

3

Existe-t-il une table Hashtable ou Dictionary dans .NET qui vous permet d'accéder à sa propriété .Index pour l'entrée dans l'ordre dans lequel elle a été ajoutée à la collection?

No. Vous pouvez enumarate sur tous les éléments d'un Hastable ou dictionnaire, mais ceux-ci ne sont pas gaurenteed être dans une sorte d'ordre (le plus probable qu'ils ne sont pas)

vous devez utiliser soit une structure de données différente (comme SortedDictionary ou SortedList) ou utilisez une liste séparée pour stocker l'ordre dans lequel ils ont été ajoutés. Vous voudriez emballer la liste ordonnée et votre dictionnaire/hashtable dans une autre classe pour les maintenir synchronisés.

3

Vous pouvez utiliser une liste distincte pour stocker les éléments dans l'ordre dans lequel ils ont été ajoutés. Quelque chose le long des lignes de l'exemple suivant:

public class ListedDictionary<TKey, TValue> : IDictionary<TKey, TValue> 
{ 
    List<TValue> _list = new List<TValue>(); 
    Dictionary<TKey, TValue> _dictionary = new Dictionary<TKey,TValue>(); 

    public IEnumerable<TValue> ListedValues 
    { 
     get { return _list; } 
    } 

    public void Add(TKey key, TValue value) 
    { 
     _dictionary.Add(key, value); 
     _list.Add(value); 
    } 

    public bool ContainsKey(TKey key) 
    { 
     return _dictionary.ContainsKey(key); 
    } 

    public ICollection<TKey> Keys { get { return _dictionary.Keys; } } 

    public bool Remove(TKey key) 
    { 
     _list.Remove(_dictionary[key]); 
     return _dictionary.Remove(key); 
    } 

    // further interface methods... 
} 
1

Une alternative est de créer un tableau de stuctures, donc au lieu d'utiliser

dictionary.Add{"key1","value1"} 

vous créez une structure avec la clé/valeur comme:

public struct myStruct{ 
    private string _sKey; 
    public string sKey{ 
     get { return _sKey; } 
     set { _sKey = value; } 
    } 
    private string _sValue; 
    public string sValue { 
     get { return _sValue; } 
     set { _sValue = value; } 
    } 
} 

// create list here 
List<myStruct> myList = new List<myStruct>(); 

// create an instance of the structure to add to the list 
myStruct item = new myStruct(); 
item.sKey = "key1"; 
item.sValue = "value1"; 

// then add the structure to the list 
myList.Add(item); 

En utilisant cette méthode, vous pouvez ajouter supplémentaire dimensions à la liste sans trop d'effort, il suffit d'ajouter un nouveau membre dans la structure.

Remarque, si vous avez besoin de modifier des éléments dans la liste après avoir été ajoutée, vous devrez changer la struct dans une classe. Voir cette page pour plus d'informations sur cette question: error changing value of structure in a list

2

Jetez un oeil à la classe OrderedDictionary. Non seulement vous pouvez y accéder via les touches, mais aussi via un index (position).