Добавление элемента IList к определенному индексу - PullRequest
9 голосов
/ 01 июня 2010

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

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

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

Ответы [ 4 ]

18 голосов
/ 01 июня 2010

Использование 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, элемент добавляется в список.

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

7 голосов
/ 01 июня 2010

Использование Метод IList.Insert .

3 голосов
/ 01 июня 2010

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

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

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

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

0 голосов
/ 04 октября 2017

Он вставит и изменит размер при необходимости

 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;

        }
...