C# 在C中高效地将多个元素添加到列表的开头#

C# 在C中高效地将多个元素添加到列表的开头#,c#,list,C#,List,我有一个列表,我想添加多个元素的开始。添加到起始点是线性时间,因为它由一个数组支持,并且必须一次移动一个,如果我以一种天真的方式实现它,我无法承受这么多次 如果我确切地知道我要添加多少元素,我可以将它们全部移动那么多,使线性只发生一次吗 List<int> myList = new List<int> { 6, 7, 8, 9, 10 }; //Desired list: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] //Unacceptable fo

我有一个列表,我想添加多个元素的开始。添加到起始点是线性时间,因为它由一个数组支持,并且必须一次移动一个,如果我以一种天真的方式实现它,我无法承受这么多次

如果我确切地知道我要添加多少元素,我可以将它们全部移动那么多,使线性只发生一次吗

List<int> myList = new List<int> { 6, 7, 8, 9, 10 };
//Desired list: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

//Unacceptable
for (int i = 5; i>=0; i--){
    myList.Insert(0,i);
}

//Is this concept possible?
int newElements = 5;
for (int i = myList.Count; i>=0; i--){
    myList[i+newElements] = myList[i];//This line is illegal, Index was out of range
}
for (int i = 0; i< newElements; i++){
    myList[i] = i+1;
}
List myList=新列表{6,7,8,9,10};
//所需列表:[1,2,3,4,5,6,7,8,9,10]
//不可接受
对于(int i=5;i>=0;i--){
我的列表。插入(0,i);
}
//这个概念可能吗?
int新元素=5;
对于(int i=myList.Count;i>=0;i--){
myList[i+新元素]=myList[i];//此行非法,索引超出范围
}
for(int i=0;i

在这个特定的实例中,访问需要是固定时间,因此使用
List
。我需要能够尽可能快地向数据结构的开始和结束添加元素。我同意O(m),其中m是要添加的元素数(因为我认为这是无法避免的),但是O(m*n),其中n是现有结构中的元素数太慢了。

可以使用
InsertRange
,如果插入的集合实现
ICollection
,它将是线性的:


您可以使用
InsertRange
,如果插入的集合实现
ICollection
,则它将是线性的:



我想
myList.InsertRange(0,newElements)
会非常适合您。微软会尽可能地提高效率。

我想
myList.InsertRange(0,newElements)
很适合你。微软将尽可能提高效率。

myList.InsertRange(0,新列表{1,2,3,4,5})
myList.InsertRange(0,新列表{1,2,3,4,5})

如果新元素已在
列表中,则可以使用
List.AddRange
将“旧”列表添加到待添加项目列表的末尾。

如果新元素已在
列表中,则可以使用
List.AddRange
添加“旧”列表列出要添加的项目列表的末尾。

考虑<代码>链接目录> /代码>,你应该考虑使用其他类型的集合,比如LinkedList,我想你对收藏的工作方式太过依赖了。如果需要优化对集合开头的插入,那么
LinkedList
可能会更好,但您必须在这一点与较慢的查找性能之间取得平衡。myList.InsertRange(0,Desiredlist);如果你已经有了你需要插入的集合,只要使用一个<代码>链接目录> /Cube >,你应该考虑使用其他类型的集合,比如LinkedList。如果需要优化对集合开头的插入,那么
LinkedList
可能会更好,但您必须在这一点与较慢的查找性能之间取得平衡。myList.InsertRange(0,Desiredlist);如果您已经有了需要插入的集合,只需实际使用即可。如果
新元素
是一个
IEnumerable
而不实现
ICollection
,则它们会使它的效率非常低。它将一次枚举并插入一个项目:)这很公平,但如果你传递的是一个普通的旧可枚举项目,它的效率将尽可能高:)仅仅试图在效率上击败微软或任何大公司通常是愚蠢的。代码中效率低下的部分不在这里:)事实上,如果
新元素
是一个
IEnumerable
而不实现
ICollection
,它们会使代码变得非常低效。它将一次枚举并插入一个项目:)这很公平,但如果你传递的是一个普通的旧可枚举项目,它的效率将尽可能高:)仅仅试图在效率上击败微软或任何大公司通常是愚蠢的。代码中效率低下的部分不在这里:)干净的语法,但不确定它是否更有效。根据文档,这种方法是O(n+m)操作,其中n是要添加的元素数,m是计数。@Frisbee-比什么更有效?这就是问题所要求的,它执行列表的一个移位,然后执行
m
插入。@Frisbee-如果您只是在列表的开头执行
m
插入,则列表将是
O(m*n)
因为整个列表必须复制
m
次。OK可能是我的misunderstanding@Lee听起来这正是我要找的。我不认为在索引结构中你能得到比O(n+m)更好的结果。非常感谢。干净的语法,但不确定它是否更有效。根据文档,这种方法是O(n+m)操作,其中n是要添加的元素数,m是计数。@Frisbee-比什么更有效?这就是问题所要求的,它执行列表的一个移位,然后执行
m
插入。@Frisbee-如果您只是在列表的开头执行
m
插入,则列表将是
O(m*n)
因为整个列表必须复制
m
次。OK可能是我的misunderstanding@Lee听起来这正是我要找的。我不认为在索引结构中你能得到比O(n+m)更好的结果。非常感谢。
var newElements = new[] { 0, 1, 2, 3, 4 };
myList.InsertRange(0, newElements);