2010-06-01 12 views
9

La base de datos de nuestro cliente devuelve un conjunto de precios en una matriz, pero a veces no incluyen todos los precios, es decir, tienen elementos faltantes en su matriz. Devolvemos lo que encontramos como IList, que funciona muy bien cuando recuperamos contenido de la base de datos. Sin embargo, estamos teniendo dificultades para configurar los elementos en la posición correcta en el conjunto.Agregar un artículo IList a un número de índice particular

¿Es posible crear un IList y luego agregar un elemento en una posición particular en el IList?

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

Su pregunta no es muy clara. He respondido lo que * pienso * que estás preguntando, pero si pudieras explicar un poco más sobre lo que estás tratando de hacer, podría darte una mejor respuesta. –

+0

Creo que la respuesta es una combinación de los de Matt e Ismail. Quiero insertar un elemento en la posición 3, pero todavía no hay nada en la lista. De acuerdo con la respuesta de Matt, necesito crear una lista vacía donde el índice> índice quiero insertar, luego necesito usar la respuesta de Ismail para insertarlo. El otro problema es que la inserción empujará todas las cosas por encima de una, por lo que casi necesito crear las entradas faltantes antes de 3, luego .Add(). Bueno, al menos eso es lo que trato de hacer. LOL –

+0

En realidad, en realidad no quiere * insertar *, ¿o sí? Si la lista tiene suficientes elementos, ¿no solo desea sobrescribir uno en el elemento específico? Eso es lo que "myList [3] = myModel;" hace. –

Respuesta

3

Las listas crecen dinámicamente para acomodar elementos a medida que se agregan. Tendría que inicializar la lista con un tamaño predefinido. La forma más sencilla que puedo pensar para hacer eso sería:

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

que usted va a facilitar una lista con 100 artículos, todos nula. Entonces puede asignar un valor a myList [3].

Tenga en cuenta que en su código está tratando de crear una instancia de IList<Model> que no es posible; necesita un tipo concreto (como List<Model>) en lugar de una interfaz.

+0

Lo que me gustaría hacer es colocar un nuevo elemento en la posición 3, pero aparentemente las listas deben estar contiguas, por lo que necesito crear elementos en blanco en las posiciones inferiores a 3 y luego insertar un nuevo elemento. –

+0

Ok, entonces mi respuesta es una manera de hacerlo. Llene de antemano la lista con elementos nulos (hasta la cantidad máxima que crea que va a necesitar) y luego asigne solo los que desee. –

17

Uso 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 el índice es igual al número de elementos de la interfaz IList, a continuación, se adjunta al elemento de la lista.

En las colecciones de elementos contiguos, como listas, los elementos que siguen al punto de inserción se desplazan hacia abajo para acomodar el nuevo elemento. Si la colección está indexada, los índices de los elementos que se mueven también se actualizan. Este comportamiento no se aplica a colecciones donde los elementos se agrupan conceptualmente en segmentos, como una tabla hash.

0

Se insertará y cambiar el tamaño si es necesario

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; 

    } 

o

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; 

     } 
Cuestiones relacionadas