2009-12-17 5 views
2

Est-il possible d'insérer un élément dans une NameValueCollection dans un index spécifique? Je ne vois pas une méthode Insert().Insérer dans NameValueCollection dans .NET

+1

pourquoi avez-vous besoin? –

+0

Parce que j'ai besoin d'insérer un élément au début de la collection. NameValueCollections gère l'ordre des éléments. –

Répondre

1

Voici une implémentation d'une méthode d'extension Insert pour NameValueCollection:

static class ColExtensions 
{ 
    private class KeyValuesPair 
    { 
     public string Name { get; set; } 
     public string[] Values { get; set; } 
    } 

    public static void Insert(this NameValueCollection col, int index, string name, string value) 
    { 
     if (index < 0 || index > col.Count) 
      throw new ArgumentOutOfRangeException(); 

     if (col.GetKey(index) == value) 
     { 
      col.Add(name, value); 
     } 
     else 
     { 
      List<KeyValuesPair> items = new List<KeyValuesPair>(); 
      int size = col.Count; 
      for (int i = index; i < size; i++) 
      { 
       string key = col.GetKey(index); 
       items.Add(new KeyValuesPair 
       { 
        Name = key, 
        Values = col.GetValues(index), 
       }); 
       col.Remove(key); 
      } 

      col.Add(name, value); 

      foreach (var item in items) 
      { 
       foreach (var v in item.Values) 
       { 
        col.Add(item.Name, v); 
       } 
      } 
     } 
    } 
} 
1

Non, il n'y a pas de méthode pour insérer un élément à un index spécifique. Cependant, il devrait être trivial d'écrire une méthode d'extension pour le faire.

Quelle est la raison pour laquelle vous utilisez une NameValueCollection?

0

Ce n'est pas vraiment ce à quoi les NameValueCollection sont destinés; Si vous devez manipuler votre collection de cette manière, vous devriez envisager une structure de données différente (OrderedDictionary?). Cela dit, voici une méthode d'extension qui va faire ce que vous voulez:

static class NameValueCollectionExtensions { 
    public static void Insert(this NameValueCollection collection, int index, string key, string value) { 
     int count = collection.Count; 
     if (index < 0 || index > count) { 
      throw new ArgumentOutOfRangeException("index"); 
     } 
     List<string> keys = new List<string>(collection.AllKeys); 
     List<string> values = keys.Select(k => collection[k]).ToList(); 
     keys.Insert(index, key); 
     values.Insert(index, value); 
     collection.Clear(); 
     for (int i = 0; i <= count; i++) { 
      collection.Add(keys[i], values[i]); 
     } 
    } 
} 

Je ne sais pas que collection.AllKeys est garanti à remettre les clés dans l'ordre qu'ils ont été insérés. Si vous pouvez trouver la documentation indiquant que c'est le cas, alors ce qui précède est bien. Dans le cas contraire, remplacez la ligne

List<string> keys = new List<string>(collection.AllKeys); 

avec

List<string> keys = new List<string>(); 
for(int i = 0; i < count; i++) { 
    keys.Add(collection.Keys[i]); 
}