如何在C#中连接两个数组?

12 浏览
0 Comments

如何在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个元素)。

0
0 Comments

在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是与调用该扩展方法的作用域中的变量不同的变量。

0
0 Comments

在C#中,将两个数组连接起来的方法是使用CopyTo函数。具体的代码如下所示:

var z = new int[x.Length + y.Length];
x.CopyTo(z, 0);
y.CopyTo(z, x.Length);

这段代码的作用是创建一个新的数组z,它的长度是数组xy的长度之和。然后,将数组x的元素复制到数组z的起始位置,再将数组y的元素复制到数组z的末尾位置。

C#中更倾向于使用列表(List)而不是数组,因为列表更加强大。数组的功能在C#中主要用于Interop调用(非托管C++)和可变数量的params参数。不过,如果要将数组与另一个数组连接起来,仍然建议使用.ToList()方法。

很多系统函数返回数组而不是列表,这并不奇怪。数组是不可变的,而列表是可变的。此外,列表占用的内存比数组多,除非调用TrimExcess方法进行优化(.ToList()方法不会进行优化)。另外,数组在访问数据时比列表更快,因为列表只是在数组的外部包装了一层,并且调用索引器会有额外的开销。另外,当发送UDP数据包时,必须使用byte[]类型的数组,将列表转换为数组会消耗额外的时间。

这种方法的优点是什么?它更快吗?看起来写的代码更多。

:从CPU和内存的角度来看,这种方法更高效。而.ToArray()方法效率不高。

0
0 Comments

在C#中如何连接两个数组?

有人建议使用以下代码:

List list = new List();
list.AddRange(x);
list.AddRange(y);
int[] z = list.ToArray();

还有人建议使用以下代码:

List list = new List(x);

其中一名回答者提到这种方法更高效,因为使用`Array.Concat`至少需要进行一次内存分配和两次内存移动,而使用`List`的方法也需要进行相同的操作。另外,还提到可以在第一行代码中预先指定`List`的大小,以避免在调用`AddRange`方法时可能发生的重新分配。

还有一名回答者提到,实际上他并不是在讨论`Array.Concat`的方法,而是在讨论`Enumerable`类中的扩展方法。他解释说,这个方法实际上只是构建一个同时遍历两个数组的迭代器,因此不会进行任何复制或重新分配。

另一位回答者提到了一个关于`AddRange`方法的性能问题,并给出了一个优化的解决方案。

然而,也有人认为在现代计算机中,复制数组并不会产生太大的性能影响,尤其是在小规模的情况下。他们认为,现代计算机的处理能力足够强大,不必过于关注这种微小的性能差异。

最后,有人指出实际上有一些行业仍然非常注重处理时间的问题,比如航空自动驾驶程序和医疗保健系统。

连接两个数组的方法有很多种,每种方法都有自己的优劣势。在选择方法时,需要根据具体的需求和性能要求进行权衡。

0