部分将项目复制到列表的最佳方法是什么?

时间:2015-08-15 23:51:13

标签: c# .net arrays list copy

假设您有两个数组srcdestdest更大。您希望将src中的所有元素复制到dest的开头,并覆盖可能已存在的任何内容。为此,我们可以执行Array.Copy(src, dest, src.Length),这比for循环更简洁,更高效。

现在,说dest成为List<T>。从src复制所有元素的最有效方法是什么?我知道List是使用数组在内部实现的,所以如果我们能够得到它(当然除了反思),我们可以做一个Array.Copy,这将是一个非问题。

由于上述原因,我不是在寻找一个for循环,但如果这是唯一的方法,我想这将是必须的。

编辑:我希望不必在手机上输入代码示例,但似乎是我不得不接受错误答案:

int[] src = { 1, 2, 3 };
var dest = new List<int>() { 4, 5, 6, 7 };

for (int i = 0; i < src.Length; i++)
{
    dest[i] = src[i];
}

我正在寻找的是与上述相同的逻辑,但具有Array.Copy的性能。

5 个答案:

答案 0 :(得分:1)

要获得与Array.Copy相同的结果,我会使用

var src = new int[] { 50, 51, 52, 53, 54, 55 };
var dest = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };

dest.RemoveRange(0, src.Length);
dest.InsertRange(0, src);

// dest: [ 50, 51, 52, 53, 54, 55, 7, 8, 9, 10, 11, 12 ]

修改 此方法比Array.Copy慢约7倍,但对于大型数组来说,比循环遍历数组要快得多。如果您有小数组源,则循环可能是最佳选择。

答案 1 :(得分:1)

我认为你正在寻找这样的东西:

int[] desta = (int[]) typeof(List<int>)
               .GetField("_items", BindingFlags.NonPublic |     BindingFlags.Instance)
               .GetValue(dest);
Array.Copy(src, desta, src.Length)

答案 2 :(得分:0)

为什么不能在ToList()数组上拨打src,这将从List<int>创建int[]。一小部分样本

        int[] src = new int[] { 1,2,3,4,5,6,7,8,44,555,45,654};
        List<int> dest = src.ToList();

答案 3 :(得分:0)

如果你的src是一个列表,另一个选项是使用List中定义的ForEach,我相信性能类似于Array.Copy

dest = new List<T>();
src.ForEach(item => dest.Add(item));

如果您需要价值复制,可以写下:

src.ForEach(item => dest.Add(item.Clone()));

在这种情况下,只需要确保项目是ICloneable。

答案 4 :(得分:0)

刚刚将您的函数与Array.Copy()函数进行了比较。

//values used for the benchmark
int[] src = { 1, 2, 3 };
int[] destArray = { 4, 5, 6, 7 };
var destList = new List<int>() { 4, 5, 6, 7 };

//Array.Copy() test : avarage 1004 ms
for (int i = 0; i < 20000000; i++)
{
    Array.Copy(src, destArray, src.Length);
}
//Your solution test : avarage 634 ms
for (int i = 0; i < 20000000; i++)
{
    Copy(src, destList, src.Length);
}

public void Copy(int[] sourceArray, List<int> destinationList, int length)
{
    for (int i = 0; i < length; i++)
    {
        destinationList[i] = sourceArray[i];
    }
}

*这些结果是20个基准的平均值。