2010-06-01 11 views
9

La base de données de notre client renvoie un ensemble de prix dans un tableau, mais parfois ils n'incluent pas tous les prix, c'est-à-dire qu'ils ont des éléments manquants dans leur tableau. Nous renvoyons ce que nous trouvons comme un IList, ce qui fonctionne bien lorsque nous récupérons du contenu de la base de données. Cependant, nous avons des difficultés à placer les éléments dans la bonne position dans le tableau.Ajout d'un élément IList à un numéro d'index particulier

Est-il possible de créer un IList puis d'ajouter un élément à une position particulière dans IList?

var myList = new List<Model>(); 
var myModel = new Model(); 
myList[3] = myModel; // Something like what we would want to do 
+0

Votre question n'est pas très claire. J'ai répondu à ce que je * pense * que vous demandez, mais si vous pouviez préciser un peu ce que vous essayez de faire, je pourrais peut-être vous fournir une meilleure réponse. –

+0

Je pense que la réponse est un combo de Matt et Ismail. Je veux insérer un élément dans la position 3, mais rien dans la liste n'existe encore. Selon la réponse de Matt, j'ai besoin de créer une liste vide où l'indice count> que je veux insérer, puis j'ai besoin d'utiliser la réponse d'Ismail pour l'insérer. L'autre problème est que l'insertion poussera toutes les choses au-dessus d'une unité, donc j'ai presque besoin de créer des entrées manquantes avant 3, alors .Add(). Eh bien, au moins c'est ce que j'essaie de faire. LOL –

+0

Vous ne voulez pas réellement * insérer * si, n'est-ce pas? Si la liste contient suffisamment d'éléments, ne souhaitez-vous pas remplacer celle de l'élément spécifique? C'est ce que "myList [3] = myModel;" Est-ce que. –

Répondre

3

Les listes se développent dynamiquement pour accueillir les éléments lors de leur ajout. Vous devez initialiser la liste avec une taille prédéfinie. La meilleure façon que je peux penser à faire serait:

var myList = new Model[100].ToList(); 

Cela vous donnera une liste de 100 articles, tous nuls. Vous êtes alors libre d'attribuer une valeur à myList [3].

Notez que dans votre code vous essayez d'instancier un IList<Model> ce qui n'est pas possible - vous avez besoin d'un type concret (comme List<Model>) plutôt qu'une interface.

+0

Ce que je voudrais faire est de coller un nouvel objet en position 3, mais apparemment les listes doivent être contiguës, j'ai donc besoin de créer des objets vides à des positions inférieures à 3 puis insérer un nouvel élément. –

+0

Ok, alors ma réponse est une façon de le faire. Prépopulez la liste avec des objets nuls (jusqu'à concurrence du montant maximum dont vous pensez avoir besoin) puis assignez-les uniquement à ceux que vous voulez. –

17

Utilisez IList<T>.Insert(int index,T item)

IList<string> mylist = new List<string>(15); 
mylist.Insert(0, "hello"); 
mylist.Insert(1, "world"); 
mylist.Insert(15, "batman"); // This will throw an exception. 

De MSDN

Si l'indice est égal au nombre d'éléments dans le IList, l'élément est ajouté à la liste.

Dans les collections d'éléments contigus, tels que les listes, les éléments qui suivent le point d'insertion se déplacent pour s'adapter au nouvel élément. Si la collection est indexée, les index des éléments qui sont déplacés sont également mis à jour. Ce comportement ne s'applique pas aux collections dans lesquelles les éléments sont regroupés de manière conceptuelle dans des compartiments, tels qu'une table de hachage.

0

Il insérera et redimensionner si nécessaire

public static IList<T> InsertR<T>(this IList<T> ilist, int index, T item) { 

     if (!(index < ilist.Count)) { 

      T[] array = Array.CreateInstance(typeof(T), index + 1) as T[]; 

      ilist.CopyTo(array, 0); 

      array[index] = item; 

      if (ilist.GetType().IsArray) { 
       ilist = array; 
      } else { 
       ilist = array.ToList(); 
      } 


     } else 
      ilist[index] = item; 

     return ilist; 

    } 

ou

public static IList InsertR<T>(this IList ilist, int index, T item) { 

      if (!(index < ilist.Count)) { 

       T[] array = Array.CreateInstance(typeof(T), index + 1) as T[]; 

       ilist.CopyTo(array, 0); 

       array[index] = item; 

       if (ilist.GetType().IsArray) { 
        ilist = array; 
       } else { 
        ilist = array.ToList(); 
       } 


      } else 
       ilist[index] = item; 

      return ilist; 

     }