假设您有两个数组src
和dest
。 dest
更大。您希望将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的性能。
答案 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个基准的平均值。