使用索引向c# List中添加成员

本文关键字:添加 成员 List 索引 | 更新日期: 2023-09-27 18:17:38

如果我声明一个c#列表。把它的容量增加到1000。现在,如果我想直接在索引1处添加一个元素。我不能做这件事。抛出错误。有其他的选择吗?

    List<sometype> myList = new List<sometype>()
    myList.capacity = 1000;
    myList[1] = element; //exception thrown

我发现最好的替代方法是通过array。

    sometype[] myarray = new sometype[1000];
    myarray[1] = element;
    //after filling whole array
    myarray.ToList();

使用索引向c# List中添加成员

列表。Capacity只预先分配内存,以便列表可以增长到容量限制,而不会产生额外的内存分配和相关的堆碎片。设置列表。容量为1000不会使1000项可访问。列表。Count表示实际列表内容的末尾。List.Insert()不能用于插入List.Count之外的项。

创建一个包含1000个项目的数组然后转换为列表的解决方案只是调用list . add() 1000次来分配列表(push list)中的空槽的快捷方式。数到1000)。调用list . add() 1000次内存效率更高,因为使用数组技术,内存中将有2个列表副本(1个用于数组,1个用于列表)。

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

对于低密度稀疏数组,字典几乎肯定比分配一个包含1000个元素但只使用100个槽的数组更有效。我不知道Dictionary的具体实现或内存使用,但它可能是一个安全的猜测,如果你的稀疏数组的密度是50%或更高,使用数组而不是字典赢得内存和速度。

我发现最好的替代方法是通过array。

正确,正如你所演示的那样,大多数人会使用数组…

sometype[] myarray = new sometype[1000];
myarray[1] = element;

另一个选择是在设置list元素之前检查边界…

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);
}

可以使用Insert()方法,如下所示:

myList.Insert(1, element); //1 is the index

编辑csharptest.net的答案

List<sometype> myList = new List<sometype>()
while (index >= myList.Count)
    myList.Add(default(sometype)); //fill with empty
myList[1] = element;
List<sometype> myList = new List<sometype>()
myList.capacity = 1000;
myList.Add(null);
myList.Add(null);
myList.Insert(1, element); //exception not thrown