在C#中有效地将多个元素添加到List的开头

时间:2016-03-04 15:52:18

标签: 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
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。我需要能够尽快向数据结构的开头和结尾添加元素。我对O(m)没问题,其中m是要添加的元素数量(因为我不认为可以避免)但是O(m * n)其中n是现有结构中元素的数量是太慢了。

4 个答案:

答案 0 :(得分:6)

如果插入的集合实现了InsertRange,您可以使用ICollection<T>这是线性的:

var newElements = new[] { 0, 1, 2, 3, 4 };
myList.InsertRange(0, newElements);

答案 1 :(得分:1)

myList.InsertRange(0, new List<int> { 1, 2, 3, 4, 5 });

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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