Добавление элемента 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;
}