2010-06-01 20 views
9

Baza danych naszego klienta zwraca zestaw cen w tablicy, ale czasami nie obejmują one wszystkich cen, tj. Zawierają brakujące elementy w ich macierzy. Zwracamy to, co uważamy za IList, który działa świetnie, gdy odzyskujemy zawartość z bazy danych. Jednakże mamy trudności z ustawieniem elementów we właściwej pozycji w tablicy.Dodawanie elementu IList do określonego numeru indeksu

Czy można utworzyć IList, a następnie dodać element w określonej pozycji w IList?

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

Twoje pytanie nie jest bardzo jasne. Odpowiedziałem na to, o czym * myślę * pytasz, ale jeśli mógłbyś trochę rozwinąć to, co próbujesz zrobić, być może będę w stanie dostarczyć lepszej odpowiedzi. –

+0

Myślę, że odpowiedź jest kombinacją Matta i Ismaila. Chcę wstawić element na pozycję 3, ale nic na liście jeszcze nie istnieje. Zgodnie z odpowiedzią Matta, muszę utworzyć pustą listę, w której chcesz wstawić count> index, a następnie użyć odpowiedzi Ismaila, aby ją wstawić. Innym problemem jest to, że wstawka przesunie wszystkie elementy powyżej jednej, więc prawie muszę utworzyć brakujące wpisy przed 3, a następnie .Add(). Cóż, przynajmniej to właśnie próbuję zrobić. LOL –

+0

Nie chcesz tego * wstawić *, prawda? Jeśli lista zawiera wystarczającą liczbę elementów, czy nie chcesz po prostu zastąpić tą w danym elemencie? Oto co "myList [3] = myModel;" robi. –

Odpowiedz

3

Listy rosną dynamicznie, aby uwzględnić elementy w miarę ich dodawania. Będziesz musiał zainicjować listę o wstępnie zdefiniowanym rozmiarze. Najprostszym sposobem mogę myśleć to zrobić byłoby:

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

To da ci listę z 100 sztuk wszystkich null. Możesz wtedy przypisać wartość do myList [3].

Należy zauważyć, że w kodzie próbujesz utworzyć instancję IList<Model>, co nie jest możliwe - potrzebujesz konkretnego typu (np. List<Model>) zamiast interfejsu.

+0

Co chcę zrobić, to przykleić nowy przedmiot na pozycji 3, ale najwyraźniej listy muszą być ciągłe, więc muszę utworzyć puste elementy na pozycjach mniejszych niż 3, a następnie wstawić nowy element. –

+0

OK, więc moja odpowiedź jest jednym ze sposobów, aby to zrobić. Przygotuj listę z pustymi przedmiotami (do maksymalnej kwoty, która według Ciebie będzie potrzebna), a następnie przypisz tylko te, które chcesz. –

17

Zastosowanie 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. 

Od MSDN

Jeśli indeks jest równa liczbie elementów w IList, wówczas element jest dołączany do listy.

W kolekcjach sąsiednich elementów, takich jak listy, elementy następujące po punkcie wstawiania przesuwają się w dół, aby pomieścić nowy element. Jeśli kolekcja jest indeksowana, indeksy przeniesionych elementów również są aktualizowane. To zachowanie nie ma zastosowania do kolekcji, w których elementy są konceptualnie pogrupowane w segmenty, takie jak tablica asocjacyjna.

0

będzie wstawiać i zmieniać w razie potrzeby

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; 

    } 

lub

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; 

     } 
Powiązane problemy