Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用索引将成员添加到C#列表_C#_.net_List - Fatal编程技术网

使用索引将成员添加到C#列表

使用索引将成员添加到C#列表,c#,.net,list,C#,.net,List,如果我声明一个C#List。使其容量达到1000。 现在,如果我想直接在索引1处添加一个元素。我做不到。投掷错误。有其他选择吗 List<sometype> myList = new List<sometype>() myList.capacity = 1000; myList[1] = element; //exception thrown 可以使用Insert()方法,如下所示: myList.Insert(1, element); //1

如果我声明一个C#List。使其容量达到1000。 现在,如果我想直接在索引1处添加一个元素。我做不到。投掷错误。有其他选择吗

    List<sometype> myList = new List<sometype>()
    myList.capacity = 1000;
    myList[1] = element; //exception thrown
可以使用Insert()方法,如下所示:

myList.Insert(1, element); //1 is the index
List myList=new List()
myList.capacity=1000;
myList.Add(空);
myList.Add(空);
myList.插入(1,元素)//未引发异常
我发现最好的替代方法是通过数组

    sometype[] myarray = new sometype[1000];
    myarray[1] = element;
    //after filling whole array
    myarray.ToList();
正确,正如您所演示的,大多数人都会使用数组进行此操作

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);
}
List myList=new List()
myList.capacity=1000;
如果(ix
List.Capacity仅预先分配内存,以便列表可以增长到容量限制,而不会导致额外的内存分配和相关的堆碎片。设置列表。容量为1000不能访问1000个条目。List.Count表示实际列表内容的结束。List.Insert()不能用于插入List.Count之外的项目

创建一个包含1000个项目的数组,然后转换为列表,这只是调用list.Add()1000次以在列表中分配空插槽的快捷方式(将list.Count推到1000)。调用List.Add()1000次会提高内存效率,因为使用数组技术,内存中将有2个列表副本(1个用于数组,1个用于列表)

您不考虑对稀疏数组使用
字典
的建议,因为它将比稀疏填充的数组使用更多内存。这取决于数据的稀疏程度。如果在索引范围0..1000中只有100项,则密度为10%。你也可以称之为90%的内存浪费


对于低密度稀疏数组,字典几乎肯定比分配一个包含1000个项但仅使用100个插槽的数组的内存效率更高。我不知道Dictionary的实现或内存使用的细节,但如果稀疏数组的密度为50%或更高,使用数组而不是Dictionary可能会赢得内存和速度。

编辑csharptest.net的答案

List<sometype> myList = new List<sometype>()
while (index >= myList.Count)
    myList.Add(default(sometype)); //fill with empty
myList[1] = element;
List myList=new List()
while(索引>=myList.Count)
添加(默认值(sometype))//填满
myList[1]=元素;

No can do,使用Add()方法。如果这是一个稀疏列表(例如10,20个项目分散在1000个范围内),您可能实际上是在查找一个
字典而不是列表。@ssg是的,它是一个稀疏列表。使用字典是个好建议。但是那样的话,我会占用更多的空间。还有更简单的吗?到目前为止,我找到的最好的解决方案是使用数组,然后使用ToList方法从中获取列表。@user1041086:相反,使用字典会占用更少的空间。不过,对于1000个整数(64位机器上为8kb),这可能没什么大不了的。通过考虑所有因素来决定。-1您不能在小于Count的位置插入,他也不会尝试执行插入,这将改变该项目之后所有内容的偏移量。谢谢csharptest.net。我修改了我的答案。
List<sometype> myList = new List<sometype>()
while (index >= myList.Count)
    myList.Add(default(sometype)); //fill with empty
myList[1] = element;