Добавление элемента IList в определенный номер индекса

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

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

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

4 ответов


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

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

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

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


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

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



Он будет вставлять и изменять в случае необходимости

 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;

        }