我们客户的数据库在数组中返回一组价格,但它们有时不包括所有价格,即它们的数组中缺少元素。我们返回我们发现的IList,当我们从数据库中检索内容时,它非常有用。但是,我们很难将元素设置在数组中的正确位置。
是否可以创建IList然后在IList中的特定位置添加元素?
var myList = new List<Model>();
var myModel = new Model();
myList[3] = myModel; // Something like what we would want to do
答案 0 :(得分:18)
使用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
如果index等于IList中的项目数,则将项目附加到列表中。
在连续元素(如列表)的集合中,插入点后面的元素向下移动以容纳新元素。如果集合已编制索引,则还会更新已移动元素的索引。此行为不适用于元素在概念上分组为存储区的集合,例如哈希表。
答案 1 :(得分:7)
答案 2 :(得分:3)
列表会动态增长以容纳添加的项目。您必须使用预定义的大小初始化列表。我能想到的最简单的方法是:
var myList = new Model[100].ToList();
那将给你一个包含100个项目的列表,全部为空。然后,您可以自由地为myList [3]分配一个值。
请注意,在您的代码中,您尝试实例化IList<Model>
这是不可能的 - 您需要一个具体类型(如List<Model>
)而不是接口。
答案 3 :(得分: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;
}