2010-06-01 5 views
9

База данных нашего клиента возвращает набор цен в массиве, но иногда они не включают в себя все цены, т. Е. У них отсутствуют элементы в их массиве. Мы возвращаем то, что находим как IList, который отлично работает, когда мы извлекаем контент из базы данных. Однако у нас возникают трудности с установкой элементов в правильное положение в массиве.Добавление элемента IList к определенному номеру индекса

Возможно ли создать IList, затем добавить элемент в определенное положение в IList?

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

Ваш вопрос не очень понятно. Я ответил на то, о чем я * думаю * вы спрашиваете, но если бы вы могли подробно рассказать о том, что вы пытаетесь сделать, я мог бы дать лучший ответ. –

+0

Я думаю, что ответ - это комбо Мэтта и Исмаила. Я хочу вставить элемент в позицию 3, но пока ничего в списке не существует. Согласно ответу Мэтта, мне нужно создать пустой список, где count> index, который я хочу вставить, тогда вам нужно использовать ответ Ismail, чтобы вставить его. Другая проблема заключается в том, что вставка будет подталкивать все выше ее, поэтому мне почти нужно создать любые пропущенные записи до 3, затем .Add(). Ну, по крайней мере, это то, что я пытаюсь сделать. LOL –

+0

Вы действительно не хотите * вставлять *, хотя, не так ли? Если список содержит достаточно элементов, не хотите ли вы просто перезаписать его в конкретном элементе? Вот что «myList [3] = myModel;» делает. –

ответ

3

Списки динамически растут, чтобы разместить предметы по мере их добавления. Вам нужно будет инициализировать список с предопределенным размером. Самый простой способ, которым я могу думать, чтобы сделать это было бы:

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

Это даст вам список с 100 пунктами, весь нулем. Затем вы можете присвоить значение myList [3].

Обратите внимание, что в коде вы пытаетесь создать экземпляр IList<Model>, который невозможен - вам нужен конкретный тип (например, List<Model>), а не интерфейс.

+0

Что я хотел бы сделать, это вставить новый элемент в позицию 3, но, видимо, списки должны быть смежными, поэтому мне нужно создать пустые элементы в положениях ниже 3, а затем вставить новый элемент. –

+0

Итак, мой ответ - один из способов сделать это. Преподавайте список с нулевыми значениями (до максимальной суммы, которую вы считаете нужным), затем назначьте только те, которые вы хотите. –

17

Использование 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. 

Из MSDN

Если индекс равен числу элементов в IList, то элемент добавляется в список.

В коллекциях смежных элементов, таких как списки, элементы, которые следуют за точкой ввода, перемещаются вниз, чтобы разместить новый элемент. Если индекс индексируется, индексы перемещаемых элементов также обновляются. Это поведение не применяется к коллекциям, где элементы концептуально сгруппированы в ведра, такие как хеш-таблица.

0

Это будет вставлять и изменять размеры при необходимости

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; 

    } 

или

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; 

     } 

 Смежные вопросы

  • Нет связанных вопросов^_^