如何在C#中连接两个数组?
如何在C#中连接两个数组?
int[] x = new int[] { 1, 2, 3 }; int[] y = new int[] { 4, 5 }; int[] z = // 在这里填写你的答案... Debug.Assert(z.SequenceEqual(new int[] { 1, 2, 3, 4, 5 }));
目前我使用的是
int[] z = x.Concat(y).ToArray();
是否有更简单或更高效的方法?
请小心使用Concat
方法。帖子Array Concatenation in C#解释了:
对于大数组,var z = x.Concat(y).ToArray();
是低效的。这意味着Concat
方法只适用于中等大小的数组(最多10000个元素)。
在C#中如何连接两个数组?
问题的出现原因是因为在C#中,没有内置的方法来连接两个数组。因此,我们需要自己编写一个扩展方法来实现这个功能。
解决方法是编写一个扩展方法,具体代码如下:
public static T[] Concat(this T[] x, T[] y) { if (x == null) throw new ArgumentNullException("x"); if (y == null) throw new ArgumentNullException("y"); int oldLen = x.Length; Array.Resize (ref x, x.Length + y.Length); Array.Copy(y, 0, x, oldLen, y.Length); return x; }
使用该扩展方法连接两个数组的示例代码如下:
int[] x = {1,2,3}, y = {4,5}; int[] z = x.Concat(y); // {1,2,3,4,5}
另外,有人可能会问是否已经有一个适用于任何IEnumerable的扩展方法可以连接两个数组。是的,确实有这样的扩展方法,可以适用于大多数情况。但是它们有很多开销。具体使用哪种方法取决于具体情况,大多数情况下这些开销是可以接受的。但是如果你处于少数情况下,直接进行内存拷贝和数组操作会更方便。
另外还有一个问题是为什么使用Copy方法比CopyTo方法更快。这是一个错误的评论。我之前进行了一些测试,发现Copy方法更快。但是现在看来它们的速度是相同的。我之前的发现可能是因为整体而言,Marc的方法更高效,因为他在返回相同实例的同时,Zed的方法创建了一个新数组。对此表示抱歉。
最后还有一个问题是是否需要将x作为ref参数传递给Resize方法。在这个方法内部,x只是一个局部变量,将x作为ref参数传递给resize方法会创建一个新的数组,并将局部变量x指向它。换句话说,传递给resize方法的x和扩展方法内部的x是同一个变量,但是扩展方法中的x并不是以ref方式传递的,因此扩展方法中的x是与调用该扩展方法的作用域中的变量不同的变量。
在C#中,将两个数组连接起来的方法是使用CopyTo
函数。具体的代码如下所示:
var z = new int[x.Length + y.Length]; x.CopyTo(z, 0); y.CopyTo(z, x.Length);
这段代码的作用是创建一个新的数组z
,它的长度是数组x
和y
的长度之和。然后,将数组x
的元素复制到数组z
的起始位置,再将数组y
的元素复制到数组z
的末尾位置。
C#中更倾向于使用列表(List)而不是数组,因为列表更加强大。数组的功能在C#中主要用于Interop调用(非托管C++)和可变数量的params
参数。不过,如果要将数组与另一个数组连接起来,仍然建议使用.ToList()
方法。
很多系统函数返回数组而不是列表,这并不奇怪。数组是不可变的,而列表是可变的。此外,列表占用的内存比数组多,除非调用TrimExcess
方法进行优化(.ToList()
方法不会进行优化)。另外,数组在访问数据时比列表更快,因为列表只是在数组的外部包装了一层,并且调用索引器会有额外的开销。另外,当发送UDP数据包时,必须使用byte[]
类型的数组,将列表转换为数组会消耗额外的时间。
这种方法的优点是什么?它更快吗?看起来写的代码更多。
:从CPU和内存的角度来看,这种方法更高效。而.ToArray()
方法效率不高。
在C#中如何连接两个数组?
有人建议使用以下代码:
Listlist = new List (); list.AddRange(x); list.AddRange(y); int[] z = list.ToArray();
还有人建议使用以下代码:
Listlist = new List (x);
其中一名回答者提到这种方法更高效,因为使用`Array.Concat`至少需要进行一次内存分配和两次内存移动,而使用`List
还有一名回答者提到,实际上他并不是在讨论`Array.Concat`的方法,而是在讨论`Enumerable`类中的扩展方法。他解释说,这个方法实际上只是构建一个同时遍历两个数组的迭代器,因此不会进行任何复制或重新分配。
另一位回答者提到了一个关于`AddRange`方法的性能问题,并给出了一个优化的解决方案。
然而,也有人认为在现代计算机中,复制数组并不会产生太大的性能影响,尤其是在小规模的情况下。他们认为,现代计算机的处理能力足够强大,不必过于关注这种微小的性能差异。
最后,有人指出实际上有一些行业仍然非常注重处理时间的问题,比如航空自动驾驶程序和医疗保健系统。
连接两个数组的方法有很多种,每种方法都有自己的优劣势。在选择方法时,需要根据具体的需求和性能要求进行权衡。