如果我声明一个C#列表。使其容量达到1000。 现在,如果我想直接在索引1处添加元素,我无法做到。抛出错误。有没有其他选择?
List<sometype> myList = new List<sometype>()
myList.capacity = 1000;
myList[1] = element; //exception thrown
我找到的最好的选择是通过数组。
sometype[] myarray = new sometype[1000];
myarray[1] = element;
//after filling whole array
myarray.ToList();
答案 0 :(得分:5)
List.Capacity仅预先分配内存,以便列表可以增长到容量限制,而不会产生额外的内存分配和相关的堆碎片。将List.Capacity设置为1000不会使1000个条目可访问。 List.Count表示实际列表内容的结尾。 List.Insert()不能用于插入List.Count之外的项目。
创建1000个项目的数组然后转换为列表的解决方法只是调用List.Add()1000次以在列表中分配空插槽(将List.Count推送到1000)的快捷方式。调用List.Add()1000次可以提高内存效率,因为使用数组技术,内存中将有2个列表副本(数组为1,列表为1)。
您对使用Dictionary<int, sometype>
使用稀疏数组的建议不以为然,因为它会使用比稀疏填充数组更多的内存。这取决于您的数据有多稀疏。如果索引范围中只有100个项目为0..1000,则密度为10%。你也可以称之为90%的内存浪费。
对于低密度稀疏阵列,字典几乎肯定会比分配1000个项目的数组更有效,但只使用100个插槽。我不知道Dictionary的实现或内存使用的具体细节,但可能是一个安全的猜测,如果你的稀疏数组的密度是50%或更高,使用数组而不是字典会赢得内存和速度。
答案 1 :(得分:3)
您可以使用Insert()方法,如下所示:
myList.Insert(1, element); //1 is the index
答案 2 :(得分:3)
我找到的最好的选择是通过数组。
正确,大多数人会在演示时使用数组...
sometype[] myarray = new sometype[1000];
myarray[1] = element;
另一个选项是在设置列表元素之前检查边界...
List<sometype> myList = new List<sometype>()
myList.capacity = 1000;
if( ix < myList.Count )
myList[1] = element; //replace element
else
{
while(myList.Count < (ix-1))
myList.Add(default(sometype)); //fill with empty
myList.Add(element);
}
答案 3 :(得分:1)
编辑csharptest.net的答案。
List<sometype> myList = new List<sometype>()
while (index >= myList.Count)
myList.Add(default(sometype)); //fill with empty
myList[1] = element;
答案 4 :(得分:0)
List<sometype> myList = new List<sometype>()
myList.capacity = 1000;
myList.Add(null);
myList.Add(null);
myList.Insert(1, element); //exception not thrown